(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).
Also: I found myself using `schema/optional-key` so much in this file that I made an alias for it at the top of the namespace (`ok`).  We should be consistent about either using that alias or not using it in this namespace.  I'd be fine with getting rid of it, or changing your added fields to use `ok`.