Move the coroutine implementation to a .cpp file.
Make coroutine really movable and comparable. And use it correctly.
Cleanup.