Make `ConnectionSpy` and `RedisSpy` easier to extend

This updates the `ConnectionSpy` and `RedisSpy` that it uses and
makes them easier to extend. This simplifies their interfaces and
makes it so a redis spy can be optionally passed in. This allows
creating a custom redis spy and using that with a connection spy.
This also moves the `RedisSpy` out from under the `ConnectionSpy`
so it is simpler to inherit from. All of this makes the spy more
usable as a base that can be extended with custom behavior.