walkFilterNodes
Lazily walks every node of these filter trees (roots included) depth-first without recursion, so arbitrarily deep trees cannot overflow the stack. Nodes are visited last-in-first-out: the last root first, and each node before its children. Consumers can stop early, e.g. once a node budget is exceeded.