Encapsulation with private members and accessors is nice, but for something
that is just a POD and will most probably stay that way, it's overkill [1].
So we're turning the classes into structs with direct member access.
Most beneficially, this makes protocol.h much nicer to read.
As a bonus, we introduce a common baseclass that holds the handler() method to
remove duplication.
[1] Even Qt sets a precedent for that, e.g. QPair and many other PODs that are
implemented as structs with public member access even in the public API.