MessageBody represents the request or response body of a [class@Message].
Note that while length always reflects the full length of the message body, data is normally
null, and will only be filled in after [method@MessageBody.flatten] is called. For client-side messages, this
automatically happens for the response body after it has been fully read. Likewise, for server-side messages, the request body is automatically
filled in after being read.
As an added bonus, when data is filled in, it is always terminated with a `\0` byte (which is not reflected in length
).