Separate structures for requests and responses

Requests and responses now each have their own data structures. This was
necessary so that the response header could include more information.

Next step is to define individual message sizes so that all messages
aren't strictly defined to one length. This may mean an empty message
can't be passed to the message assemblers as the message size won't be
known until the assembler is called.