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.
Hmmm. The thing is, cancel is technically the responsibility of the underlying client. It's just that our clients are actually not clients, but wrappers over them. Not sure. Twisted is the responsible party for wait / cancel.