I think there're 2 possible implementations:

1. Users can call the same unpackFoo again if the unpackFoo causes InsufficientException. Unpacker needs to store `head` and `nextSize` so that unpackXxx can read head byte (and size) multiple times.
2. Users can call unpackXxx methods only once. If unpackXxx throws an exception, input stream is assumed broken. Unpacker will be much simpler because it doesn't need to store `head` and `nextSize`.