Defer open until fill or drain.

This way, the only way we can enter the error state is as a result of a fill,
drain, or end operation. Previously, it was possible to go into the error state
asynchronously after creation.