ensure coroutine generated exceptions are propagated

Currently, when an exception occurs in a coroutine method, the event loop exits without notifiying the main process, causing it to hang. This resolves that using the second technique from https://docs.python.org/3/library/asyncio-dev.html#detect-exceptions-never-consumed.