new connection management strategy

Connections are created on the fly as the client needs more. Initial .Connect
no longer necessary.

Strategy: when a call is made and a connection is immediately available, use
it. Otherwise, open a new connection, use it, and release it into the "pool".
The pool grows dynamically, and connections that are unused for some amount of
time (5 seconds) are automatically closed and released.

This keeps the client from having to know which API calls are blocking (like
Link, Run, and Stream). Previously it would open a new connection for these
calls as they could take arbitrary amounts of time. However some calls like
Info, Create, or Destroy could also take a while.

This also allows the client to be used for a bunch of concurrent requests,
without constantly having to maintain a pool of open connections or having to
create a new one for every API call.