Previously, calls to `open` blocked when creating a writeable pipe.
This could cause other calls to block indefinitely, waiting for the pipe
to become available.
Now, we open the pipe in nonblocking mode, which allows us to retry
indefinitely, checking `stopReadOperation` each time to find out whether
`close` has been called and allowing a graceful exit.