Add reader and lineReader.
Add buffer reader.
Buffer reader is binary.
Add writer.
Rename bufferReader to fixedReader.
Add lineWriter.

Also, ignore EPIPE errors in writer.
Return orphan chunk for fixedReader.

If the file isn’t big enough to contain the last return, return whatever’s left
before returning null.
Avoid unnecessary slice.
Write repeatedly until all bytes are written.
Open files immediately.

Also, fix deferred write.
Defer next read until writer is ready.
Make consistent.
Experimenting with new sync/async API.

This is closer to Node’s “Streams2” and supports both an asynchronous function
for file system operations and a synchronous function for in-memory operations.
Simplify end logic.
Logic tweaks.

Don’t need to check if the writer is available before writing, because we flush
after each write, which is guaranteed to empty the buffer and thus the writer
will always be available (for at least one write). Also, we always need to flush
before filling the reader, as filling the reader overwrites its buffer.

(If you want to flush and fill in parallel, you need to make a separate copy of
the read buffer so that it doesn’t get overwritten before the flush.)
Must signal end separately.

Can’t use available bytes to indicate end because it’s possible that only SOME
of the bytes will be read before the reader is refilled (e.g., in the case of a
fixed-sized record reader where the read buffer size is not a multiple of the
fixed record size).
Simplify.
TODO
Generic reader & writer.

Rename file-specific functions.
Fix additional writes after reader ends.

Also fix callback when open finishes before first write flush.