Use unbound to manage variable names.
Use MonadPlus to generalize some monad types.
Use unbound to track free variables and bindings.
Use unbound to manage gate names.
Turn on and fix a variety of warnings.
Ensure that impossibleGates preserves structure.

I can't find a test input that distinguishes between `simplify` with and
without this patch, but with this patch it is easier to convince myself
that the transformation is correct.
Rewrite simplify in terms of smart constructors.
Ensure impossibleGates results are simplified.

By inserting single-step simplifications where impossibleGates rebuilds
the behavior, we can avoid having to re-simplify the whole tree.
Recurse using descendBehavior, not everywhereM.

The next commit goes wildly wrong if we aren't careful about exactly
how we traverse through bindings.
Use unbound to track free and hidden gates.