title: How does StartCoroutine / yield return pattern really work in Unity?
body: <p>I understand the principle of coroutines. I know how to get the standard <code>StartCoroutine</code> / <code>yield return</code> pattern to work in C# in Unity, e.g. invoke a method  returning <code>IEnumerator</code> via <code>StartCoroutine</code> and in that method do something, do <code>yield return new WaitForSeconds(1);</code> to wait a second, then do something else.</p>
  
  <p>My question is: what's really going on behind the scenes? What does <code>StartCoroutine</code> really do? What <code>IEnumerator</code> is <code>WaitForSeconds</code> returning? How does <code>StartCoroutine</code> return control to the "something else" part of the called method? How does all this interact with Unity's concurrency model (where lots of things are going on at the same time without use of coroutines)?</p>