Assert that all members of a RichEnum are the same concrete type

Having differing RichEnumValue subclasses used in the same RichEnum has proven to be the source of many subtle bugs.

This does make RichEnum slightly less flexible, but in our view the tradeoff is worth it.