Making this MessageBuffer immutable means we should separate the implementation for getXXX and putXXX.  I don't agree with this idea, because MessageBuffer is just an abstraction of a memory that can be read and write.   

Having a cursor like ByteBuffer might be good, but to support lookAhead(...) we need to provide peekByte(..) method.