introduce callback-style asynchronous API methods

Use of these methods allows for more complex handling of out-of-order results than the Future-returning asynchronous methods, which are now reimplemented in terms of the new callback-style methods but continue to function as before.

Note: Callbacks must complete quickly and must not block or wait.