Render instance context constraints as predicate nodes
Was: instance → class node, edge labelled "ctx: <args>".
Now: instance → predicate node ("Foo a b" rendered like a constraint),
edge labelled "instance context".
The new node kind 'predicate' deduplicates on a structural id
(class qid + JSON-stringified args), so the same constraint surfaces
once even when it appears in multiple superclass / context slots —
the next commit relies on this to merge unmatched-superclass
requirements with overlapping context predicates.
Side panel grows a renderPredicatePanel that explains the node's role
and links to the underlying class.
Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>