runtime: frame header measures words, not bytes
runtime: decoders now generate messages, not segment lists
tests: deserialize(serialize(x)) = x for all x