hasDescendant
Returns true if any dirty scope is a strict descendant of key.
For structural keys (DefaultGlobalKey, ManualGlobalKey) this is an O(1) hash lookup. For StringGlobalKey dirty scopes, falls back to O(log n) NavigableSet lookup via string-prefix comparison.