isOrIsDescendantOf
Returns true if this key equals ancestor or is a descendant of it.
For structural keys (DefaultGlobalKey, ManualGlobalKey) the parent chain is walked with no string allocation. When either side is a StringGlobalKey (legacy, flag-off path) falls back to toString prefix comparison.
Note: the StringGlobalKey fallback uses String.startsWith, which can produce false positives across sibling keys that share a textual prefix -- e.g. with ancestor = "1", the key "10,2" is reported as a descendant even though it is not. This behaviour is inherited from the pre-structural code path and is preserved for compatibility.