differentiator: visitor-simplify: allow pure symbolic simplification without implied variable substitution.
differentiator: main: default to symbolic simplification unless "SIMPLIFY" environment variable is passed.
differentiator: visitor-simplify: simplify "(a*b)^c" and "(a^b)^c".
differentiator: visitor-simplify: do second simplification pass over generated nodes for "(a*b)^c" and "(a^b)^c".

Pretty inefficient, but other ways seem to be too complicated.
Perhaps we should make visitors destructive...
all: use istringstream more efficiently, do not copy the string twice.
differentiator: node: add visit_*() top-level acceptor wrappers.
differentiator: main: use new visitor wrappers, rewrite code to avoid unnecessary tree copies.
differentiator: visitor: rip out Visitor::Util helpers.
differentiator: node, visitor-*: store children in a list.
differentiator: visitor-simplify: use range-based for where appropriate.