Resolve issues with reconnections.

Firstly we need to detect a broken connection when we write.  This is caught and we begin the reconnect logic.

The reconnect logic now contains a limit and a configurable time between connection attempts.

Additionally, when the reconnect limit expires, the queued items that we have not sent are failed with a new ConnectionDropped exception.
Reconnect logic should not apply on initial connection attempt.