Q:

Em C#, para que serve a palavra chave await?

Eu estava estudando essa documentação sobre Asp.net Identity, e nos exemplos em C# tem uma palavra-chave que eu desconheço, que é a await, exemplo :
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Register(RegisterViewModel model)
{
    if (ModelState.IsValid)
    {
        var user = new ApplicationUser() { UserName = model.UserName };
        var result = await UserManager.CreateAsync(user, model.Password);
        if (result.Succeeded)
        {
            await SignInAsync(user, isPersistent: false);
            return RedirectToAction("Index", "Home");
        }
        else
        {
            AddErrors(result);
        }
    }

    // If we got this far, something failed, redisplay form
    return View(model);
} 

Para que serve essa palavra-chave?

A:

O que é
Que await é um "comando" para o código ficar esperando pela conclusão de uma tarefa e continuar a execução normal permitindo que outras execuções possam acontecer concomitantemente, todo mundo já disse. Vou dar alguns detalhes extras.
Um await só pode ser usado em um método declarado com o modificador async. O compilador precisa saber de antemão que aquele método vai precisar de uma máquina de estado que permita a execução concomitante do código a ser esperado e de outros fluxos de código na sua aplicação. Então este código é executado assincronamente.
Máquina de estados
O await indica em que ponto o código vai sofrer a cisão e a máquina de estados criada internamente na sua aplicação (você não precisa saber da existência dela) vai ter que ficar intercalando a execução das duas frentes de execução. Neste ponto, é como se o código sofresse um enceramento do método ali com um return, mais precisamente um yield return e devolvesse o controle do código para o seu método chamador fazer o que ele tem que fazer normalmente. Enquanto isso o código que vem em seguida ao await que está na mesma linha, mesmo statement, continua sendo executado concomitante (em paralelo ou não). O resto do código abaixo do await também será executado após a finalização normal da tarefa em espera como se a execução nunca tivesse saído dali.
Para entender o funcionamento da máquina de estados vejamos um código demonstrado pela Microsoft:

Como o código utiliza uma máquina de estados, ele se vale de uma continuation que é providenciado pelo yield return infiltrado no seu código pelo compilador.
Tarefas
É importante notar que códigos (métodos ou lambdas) que serão executados pelo await devem obrigatoriamente retornar uma Task, ou um derivado dele, já que ele executará uma... tarefa.
Se você precisa retornar um resultado, um int por exemplo, o método/lambda chamado precisa ter seu retorno do tipo Task<int>, já que é uma operação que termina com um resultado inteiro.
Tarefa void
Na verdade pode retornar nada (void) também, ambos se forem uma ação a ser executada. Se o código retornar nada ele pode ser executado assincronamente mas não pode retomar dali em diante, ou seja, não adianta colocar nada para ser executado após a execução do código assíncrono. Raramente isto é necessário. Em um evento é um bom uso já que ele tem que retornar nada.
Convenção de nome
Não é obrigatório mas é convencionado que o método termine com a palavra Async para indicar melhor que é um método apropriado, preparado, para execução assíncrona.
Threads
Um confusão comum é imaginar que o await cria novas threads. Isto não é verdade, o await é apenas um controle de fluxo do programa como é o while ou o return. Claro que ele é mais complicado, mas não faz nada além disto. Se as tarefas (Task) envolvidas precisam de uma nova thread para melhor executar, isto é um problema para a classe Task resolver. E este tipo existe justamente para abstrair o tratamento bruto das threads permitindo um melhor entendimento e trabalho do programador.
Seu exemplo

Enquanto a aplicação está criando um usuário, que potencialmente vai demorar mais de 50ms (este é limite recomendado para decidir se algo deve ser assíncrono ou não);
sua aplicação está livre para fazer o que mais ela precise fazer sem esperar esta criação acabar.
Quando ela acabar, o fluxo será desviado para o seu código novamente e continuará a execução;
portanto verificará se a operação foi sucedida, se foi vai fazer o sign-in assincronamente, ou seja, vai liberar a aplicação novamente para fazer outras coisas e;
no seu final retorna alguma coisa;
se não foi bem sucedida, vai adicionar os erros sincronamente, ou seja, vai deixar sua aplicação esperando (nenhum problema, pode ser uma operação rápida) e;
finalmente vai retornar alguma coisa.

A:

As palavras-chave async e await são usadas para programação assíncrona. Para referência, veja: Programação assíncrona com Async e Await.
Em essência, você usa a palavra-chave async na declaração de uma função que dependa da palavra-chave await. Isso se deve ao fato de que, ao usar o await, seu programa deve "esperar" um resultado, e como "esperar" é perda de tempo, ele "espera" assincronamente (em segundo plano).
A palavra-chave await é usada para esperar até que uma função (que geralmente demora para executar completamente) retorne seu resultado -- e ela espera esse resultado sem bloquear o fluxo do programa.
A palavra-chave await deve ser usada para receber o resultado de uma Task.

A:

O que significa await
A palavra chave await serve para fazer chamadas assíncronas, de forma que se o método sendo chamado for demorar, tudo o que vem depois da chamada usando await fica em suspenso, esperando para ser executado numa fila.
Por exemplo:
código parte 1;
await FazerAlgoQuePodeDemorar();
código parte 2;

Se a função chamada FazerAlgoQuePodeDemorar em sua implementação interna for demorar, ela vai se interromper, deixando o código-parte-2 em suspenso, aguardando para ser executado após o término do processamento interno da função chamada usando await.
E no contexto do MVC?
Uma ação do MVC que seja definida com async, permite que um método dentro dela seja chamado com await, fazendo com que o MVC não ocupe a fila de requisições que são processadas pelo servidor, até que o método chamado com await termine, e finalmente retorne um resultado.
Isso foi feito porque cada vez que uma ação não síncrona é chamada, ela ocupa uma thread das que estão disponíveis para processar os requests, sendo que existe um limite a quantidade de threads que fazem esse trabalho. Usando async, a thread de processamento de request é liberada para processar outros requests, enquando que uma chamada feita com await cuida do processamento do request feito anteriormente em outro plano.
Isso só é realmente útil, para ações que fazem chamadas de I/O, como acesso a bancos de dados, requests à servidores externos, gravações no disco rígido, entre outras tarefas que podem ser feitas assíncronamente.
Referências
MSDN: Usando um controlador assíncrono em ASP.NET MVC
Nesse tópico da MSDN, tem uma imagem bem explicativa do que acontece, basicamente tudo o que vem depois da chamada usando await na ação assíncrona, é transferida para outra thread, que não a do pool que atende requests, deixando-o, portanto, livre para atender outros requests.

Este blog, em inglês, explica exatamente as chamadas de ações assíncronas, usando async e por que o seu uso faz com que o servidor seja capaz de atender mais requests simultaneamente.

