The purpose of BufferedIO is to provide a common interface for I/O
devices that can read and write data through a buffer. Devices that
implement BufferedIO include ordinary files, memory-mapped files,
and bytestrings. The underlying device implementing a Handle must
provide BufferedIO.

Prepares an empty write buffer. This lets the device decide
how to set up a write buffer: the buffer may need to point to a
specific location in memory, for example. This is typically used
by the client when switching from reading to writing on a
buffered read/write device.

There is no corresponding operation for read buffers, because before
reading the client will always call fillReadBuffer.