Contract every CngxErrorScope (or external override) fulfils.
The scope encapsulates the "should errors be visible right now?"
decision. A scope starts hidden (showErrors === false) and reveals
when reveal is called - typically on form submit, on route
navigation, or on programmatic error trigger.
Descendant directives (CngxErrorAggregator, CngxErrorState) read
the scope's showErrors signal to gate their own visibility, so a
single reveal() propagates atomically through the subtree.