(TK-27) Allow user to manage clients explicitly

This PR will allow the user to explicitly create instances of a sync or async client, and then use those clients for multiple http requests. All the previous APIs remain intact; if the user uses the old http request functions, things will behave as they did before (i.e., it will create a new client and close it once the response comes in).
This function looks good, but wondering if it should go in the existing `async` namespace rather than a new namespace?  This will be a fairly public API function, so would be nice to minimize the surface area of API namespaces that users need to know about.