Added a linear solver mutator.

This PR has been split out of the specialize_branched_loops branch for easier review. I have added a class that implements a linear solver mutation on expressions. The idea is that you provide an equality or inequality expression, a variable you want to solve for, and a list of free variables that may appear in the expression. The solver then attempts to mutate the expression such that the variable you are solving for appears alone on the left hand side of the equation. If the solve does not succeed, e.g. because the expression was not linear, then the expression is returned unmutated. This solver is used extensively in the specialize_branched_loops optimization pass.
Super nitpicky: This line uses Expr::operator *, the identical piece of logic for terms[0] (line 191) uses Mul::make. Either one is fine here (it's pretty easy to read either way), with slight preference to operator * I suppose.