Initial implementation of interceptors.

I'm anticipating implementing interceptors at two independent parts
of the API. The first is high-level interceptors, that intercept
before the socket connection has been established.

The second set of interceptors will only execute for requests that
require a socket connection. Those are forthcoming.
I think the mutability of this means you need to add a section to `copyWithDefaults` that sets either `Collections.emptyList()` or a new `ArrayList`.