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.
Do we even need this method now? It doesn't use self and it just calls cancel on the thing you pass it.

Probably easier to just cancel directly, right? It's not used in sync at all.