Allow more flexible adding of stored responses

This updates stored responses to allow adding complex responses
in a simpler manner. If the block that is used with `add` expects
an argument, a response will be yielded to it. This response can
have its code, message or data changed in the block and will be
used as the response. This will allow users to not have to manually
build a protocol response. If an argument is not expected, then the
block will work as it previously did.
Demeter adding and removing responses for `TestClient`

This demeters adding and removing responses for `TestClient`s.
This avoids demeter violations that were commonly used like
`client.responses.add`. This is to avoid issues if we decide to
change how the responses are accessed or other parts of their
interface.
wip