This consumes the ByteString to decode a message. It assumes
the ByteString is merely a sequence of the tagged fields of the
message, and consumes until a group stop tag is detected or the
entire input is consumed. Any ByteString past the end of the
stop tag is returned as well.

The author's home brewed encoding (length written first to delimit message)

This computes the size of the message fields as in messageSize
and add the length of the encoded size to the total. Thus this is
the the length of the message including the encoded length header,
but without any leading tag.

This writes an encoded wire tag with the given FieldId and then
the encoded length of the message's fields and then the message's
fields with tags to the wire. This Put monad can be composed
and eventually executed with runPut.

Used by generated code
getBareMessage assumes the wireTag for the message, if it existed, has already been read.
getBareMessage assumes that it does needs to read the Varint encoded length of the message.
getBareMessage will consume the entire ByteString it is operating on, or until it
finds any STOP_GROUP tag