Reader performance enhancements

- Use an IOBuffer instead of an array to minimize allocation.
- Add a readbytes! method doesn't have to call read(r, Uint8)
  repeatedly, which is slow even after the IOBuffer change. This should
  restore decompress performance to what it was before
  e6ce600caad6eb981465a175d92d8e4ee6e311c5