adds a checkPure condition to the preinline phase to account for side effects when inlining
fixes a bug related to unintentional inlining of scrutinees, + added intentional inlining of scrutinees
adds match arm elimination
adds regression tests for each of the above 3 features
since the simplifier does not currently support mutual recursion, I added a check for recursive let bindings. Upon finding a let expression with a list of more than one binding, the simplifier passes along the program unmodified. I did this because I thought ignoring programs that potentially have mutually recursive bindings seemed like the easiest/simplest patch. @j-hui If you'd prefer I rename the mutual recursion regression tests to .failing instead, or some other solution, LMK.
isPure
predicate to the preinline phase to account for side effects when inlining