async: marshal returns unit and only marshals body

Two simplifications:

- Message.marshal returns () instead of the number of bytes written.
  The length of the header specifies exactly how many bytes to write.
  In fact, we were ignoring the returned int everywhere.

- Message.marshal now only marshals the body. The generic portion of
  the serializer marshals the header. This makes it possible to convert
  between chunks and parsed messages. It is also more consistent, since
  deserialization does not parse the header.