/// The transformation function is called on each node in the tree (in left-most, outer-most order) along with
/// - When the transformation function returns `Some(new_node)` for some node, that node is replaced with `new_node`.
/// - `transform`: A function which takes a mutable reference to a `Commands` object, a reference to the current node, and a reference to the metadata.
/// The function should return `Some(new_node)` if the node was transformed, or `None` otherwise.
/// - `meta`: Metadata to be passed to the transformation function. This persists across all transformations.
/// `Reduction`s encapsulate the result of applying a rule at a given node, holding the resulting node
/// is given to the `select` function, and the one returned is applied to the tree as in the `reduce` function.
/// - `select`: A function which takes the current node and an iterator of rule-`Reduction` pairs and returns the selected `Reduction`.
/// - `meta`: Metadata to be passed to the transformation function. This persists across all transformations.