refactored fifo_rw design

There were some bugs in the read/write functionality
that would allow writes even when it was full.
Since all the cases were a bit confusing it was decided
to change the design to use an empty flag instead of
one behind.  This also allows it to use all of the
available slots.

Also moved all the previous global variables in to the
per-device structure.
removed obsolete fifo_xxx test/, use fifo_rw/test instead