Я понимаю принцип сопрограммы. Я знаю, как получить стандартный шаблон StartCoroutine/yield return для работы на С# в Unity, например. вызовите метод, возвращающий IEnumerator через StartCoroutine, и в этом методе сделайте что-нибудь, сделайте yield return new WaitForSeconds(1);, чтобы подождать секунду, затем сделайте что-то еще.
Мой вопрос: что действительно происходит за кулисами? Что делает StartCoroutine действительно? Что IEnumerator возвращает WaitForSeconds? Как StartCoroutine вернуть управление части "что-то еще" вызываемого метода? Как все это взаимодействует с моделью Unity concurrency (где много вещей происходит одновременно без использования сопрограмм)?