Specialize class constraints on simplifiers.

This essentially reverts 3fb96c300abe95c6b9b1376c8bc2048835961416. I
thought I'd be threading more complicated monad transformers through
them but it turned out not to be necessary.

Specializing the class constraints ensures that GHC can generate one
optimized implementation for each function. Eliminating typeclass
dictionaries exposes a variety of other opportunities for optimization,
so GHC will try to specialize functions at each concrete type where
they're used if possible, copying the body each time.

By explicitly declaring what type these functions can be used at, it
becomes the caller's responsibility to lift them through any monad
transformers as needed, and GHC doesn't need to duplicate them or
generate inefficient dictionary-passing fallback implementations.

It might be my imagination, but I think GHC spends noticeably less time
compiling this file this way, too.
Let -fwarn-incomplete-patterns detect expr misuse.

Replacing an 'XXX: ' comment with compile-time checks: Win.
Compile with -Werror.
Allow Parallel to merge arbitrary expressions.

This is in preparation for allowing more general expressions, but
revisiting this code led to some other benefits:

- It's easier to confirm that variable names don't escape their
  bindings.

- Constructing exit expressions for each branch is much simpler.

- Arbitrary choices between the left and right branches are entirely
  confined to unifyGateValue; everything else is symmetric.
Add integer literals to the AST for Expressions.