If you need to implement an async state machine, couldn't that just as easily be done with std::future? How do coroutines make this cleaner/better?