Don't mutate clients

Fixes #68 (as well as a number of other related bugs).

Requests will no longer mutate clients.

I created an integration test that actually launches a server in a separate thread... I think it might be the best way to handle it but it will of course fail if it isn't allowed to bind a port or hits a race condition binding one.
I guess in order to support the changes I propose above, the request returned here would need to support cancel/wait instead (and this would be moved into the request.wait()).