It would be nice if `read` did necessarily have to write to a `StrBuf` (and incur the related heap allocations at some point). It could be parameterized over some trait that can append `&str`s, (or trait objects if `TextReader` will be largely used as a trait object. It could even be a `TextWriter`, although that could be more broad a trait than is necessary.

Also, is `max_bytes` the maximum number of utf8 bytes that can be read, or the maximum number of bytes from the underlying encoded data?