Add a few pattern matching rules to simplify top-level Expressions.

This exemplifies the power of pattern matching rules.

A constructor pattern looks like UnaryOperator("-", e). This pattern
matches all values of type UnaryOperator whose first argument matches
"-" and whose second argument matches e. Note that the arguments
to the constructor are themselves patterns. This allows you to write
deep patterns using a concise notation. Here’s an example:

UnaryOperator("-", UnaryOperator("-", e))

Imagine trying to implement this same functionality using the Visitor
Design Pattern! Almost as awkward, imagine implementing it as a long
sequence of if statements, type tests, and type casts.