(maint) Refactor spec tests to use shared examples

Without this patch many of the examples that specify the expected
behaviors of the types are written in a copy-and-paste cargo cult
manner.  This is a problem because there is little difference between
the actual examples and expected behaviors, only a difference in the
type and properties or parameters that the examples apply to.  This
makes it difficult for future developers to know where the single source
of truth lies for a particular property or parameter.  This patch
addresses the problem by moving nearly all of the examples into
parameterized shared example groups.  These example groups provide a
clear source of truth for how certain classes of properties and
parameters are expected to behave.