d27ed727ce
Expression unification gives TIRX a shared `Expr` surface, but its visitor and mutator APIs still expose primitive-only signatures. That mismatch prevents general expressions from flowing through the existing traversal structure and leaves statement traversal with overlapping customization hooks. This refactor generalizes the existing `ExprFunctor`, `ExprVisitor`, and `ExprMutator` signatures in place to accept and return `Expr`. Statement visitors and mutators expose a single virtual `VisitExpr(const Expr&)` hook, while primitive statement reconstruction uses a non-virtual checked `VisitPrimExpr` helper so invalid narrowing fails at the boundary. Public pre-order and post-order traversal entry points accept general `Expr` roots. The existing specialization, vtable, dispatch registration, and class structure remain intact; the change adds no parallel functor, fallback dispatcher, or alternate implementation path.