Make prepContext support async operations.

Some prep steps have an asynchronous component. For example, we might want
to load a resource from elsewhere in order to prepare. Therefore we switch
prepContext to an async callback style and let the calling application
do whatever async work it needs to do before we try to handle the
request.