Solid attempt at #30.
Fix #30.

This was quite a bit of effort, but I'm happy with the outcome. And,
in the process, I cleaned up some dirtiness around binding variables
in case statements, allowing constrained parameters to work better.
Use DsMonad. Still failing a bunch of tests. Needs more time.