Error handling at the adapter level

So applications do not need to.

We now handle listening for errors on the redis client & reconnecting if we can. We use an exponential backoff when retrying the connection.

Wrote some unit tests for this feature.