Since our framework is async by default, we should give the option for users to pass in async functions in the callbacks. This will avoid awkward use of asyncio.create_task () inside the code.