Use a ByteReader to read a byte array piece-by-piece.

The ByteReader provides an abstraction for the current position within a byte
array. Instead of doing the work manually like so:

    one_byte = byte_array[0]
    four_bytes = byte_array[1:5]
    left_bytes = byte_array[5:]

A ByteReader allows us to write the same code in an easier way:

    one_byte = byte_reader.read()
    four_bytes = byte_reader.read(4)
    left_bytes = byte_reader.tail()

In the second version it is no longer neccessary to manually calculate
indexes.