(WIP) Have the option to do async through callbacks instead of futures

* Async callback (errors are not yet managed properly)

@denpen @tokutake @MiLk @ronkorving
Assuming the callback itself can throw as well, you'll want to place that outside of the `try` block, to avoid a double call into callback.