Fleshing out retries a little bit. Was sitting on a chunk of changes that actually handled retries for the DefaultResponseHandler. The MultiActionController is also fleshed out a little bit more. Realized that retries really needed to be done on a separate thread from the netty response handling thread since typically we would want to delay the retry operation a little bit and don't want to hold the netty thread for that. So, the retry executor handles this by using a single thread scheduled executor service to schedule the retry and then upon execution, delegates the retry operation to a pool of worker threads that are in a cached thread pool so it can grow/shrink as needed (can't do this with the ScheduledExecutorService I learned). Really need some good explanation of that flow on the class holding it as it's a bit of indirection.

Also, changed how the wrappers for topology and the client itself work so that a caller to the client can get instances before actually calling startup if needed. We use a wrapper class that delegates but before delegation always checks that startup has occured (and shutdown hasn't).