Added open/openAsync methods to Stream interface to make implementation simpler. Before this, implementations
either had to open in the constructor or in write/writeAsync.
Also removed unnecessary synchronization in NettyStream that made it prone to deadlock.  The Stream client
is responsible for ensuring that there is at most one call to read/readAsync and one to write/writeAsync going on
concurrently, so Stream implementations do not have to do their own synchronization.

 JAVA-1584, JAVA-1575