Encode a couple more type constraints

 * pubrel must have QoS = 1
 * if publish has QoS = 0, it does not include a message_id

NB I ran into some difficulties with dialyzer while trying to make
types that enforced the latter. In particular, it doesn't like types
that refine remote types, e.g., `#publish{ qos :: 0 }` when #publish
is defined with `qos :: mqtt_framing:qos()`. I suspect just including
the types, instead of referring to them, may be the answer.
Move type definitions into an include

This avoids the awkwardness with trying to refine remote types, by
having the refinements in the same file(s) and therefore all local
types.

Since I need to refer to types in the frame records, and otherwise
circularity, I've also put in ifndefs.