Simpler still; no event loop required:

proc a {} {yield; coroutine C c}
proc b {} {yield; info frame}
proc c {} {tailcall B}
coroutine A a
coroutine B b
A