pub fn optimize(plan: ViewNode) -> ViewNode
Apply all optimization passes to a ViewNode tree.
Pass order matters: merge filters first so pushdown sees fewer nodes, then push predicates toward scans, then prune redundant selects.