Provide variants of request that return futures.

This allows one to issue multiple requests in parallel before waiting for them
all to complete, if desired. It also allows one to control the timeout when
waiting for results.