Что на самом деле происходит при `await` для `Task`?
Компилятор переписывает метод в конечный автомат: код до await выполняется синхронно, а если задача ещё не завершена, метод сразу отдаёт управление вызывающему коду и освобождает поток вместо блокировки. Продолжение возобновляется, когда задача завершится, по умолчанию в захваченном SynchronizationContext, поэтому библиотечный код вызывает ConfigureAwait(false), чтобы избежать дедлоков и лишних переключений контекста.