Addresses #141 Rework reconnection logic to provide two different methods for open(). The original method now just does a single connection attempt. If it fails, the Promise is notified of the failure and the user can manually retry. The second form of open() takes a Reconnect object and returns a Stream instead of a Promise. The Stream will be populated by TcpConnection objects when a connection is successful. The first time a connection is made and any subsequent reconnects will each have new TcpConnection objects associated with them.