Set writer.ended immediately.

This way, it is true when writer.end returns, rather than waiting until the
drain callback.
Use sentinel value to open channel.

This way, we don’t have to check whether the open implementation returned null.
Make no-op reader.fill & writer.drain exclusive.

The short-cut implementations of these methods weren’t properly enforcing
exclusivity.