feat(level-blocks): family composition rules as registry data
Lift the family grammar into src/level-blocks/composition.ts as pure data
and predicates: FAMILY_ORDER, FAMILY_FOLLOWS, canFollow, sortIntoBandOrder,
and FAMILY_CARDINALITY. validateGraph now loops over FAMILY_CARDINALITY
instead of hard-coding the exactly-one-search check — behavior identical,
existing tests unchanged — so a future per-family bound is a data edit.
This is the levelset-side source of truth a canvas connection checker
mirrors; a canFollow table test captures the contract so the vendor sync
can delete its own copy.