libnbaio (for "Non-Blocking Audio I/O") was originally intended to
be a purely non-blocking API.  It has evolved to now include
a few blocking implementations of the interface.
Note: as used here, "short transfer count" means the return value for
read() or write() that indicates the actual number of successfully
transferred frames is less than the requested number of frames.
Pipe
----
supports 1 writer and N readers
no mutexes, so safe to use between SCHED_NORMAL and SCHED_FIFO threads
writes:
  non-blocking
  never return a short transfer count
  overwrite data if not consumed quickly enough
reads:
  non-blocking
  return a short transfer count if not enough data
  will lose data if reader doesn't keep up
MonoPipe
--------
supports 1 writer and 1 reader
no mutexes, so safe to use between SCHED_NORMAL and SCHED_FIFO threads
write are optionally blocking:
  if configured to block, then will wait until space available before returning
  if configured to not block, then will return a short transfer count
    and will never overwrite data
reads:
  non-blocking
  return a short transfer count if not enough data
  never lose data