Shared helpers that operate on the immutable Expression tree. All transformations are functional: they return a new node and never mutate the input tree.