This allows for an internal unsafe_yield() which will
call coroutine.resume() directly from internal engine
supported yield functions.
This allows for an external yield() which now co_awaits
the event, and then event upon being set will correctly
resume the awaiting coroutine on the engine thread for
the user.
Turns out that the final_suspend() method is required
to be std::suspend_always() otherwise the coroutine_handle<>.done()
function will not trigger properly. Refactored the task class
to allow the user to decide if they want to suspend at the beginning
but it now forces a suspend at the end to guarantee that
task.is_ready() will work properly.