Decode and validate message bodies in DecodeMessage

This means that we can save some duplicate work when decoding messages
and can change the type of (*Message).Body from []byte to []interface{}.

Fixes #9 and #12.