Refactor to track old tree info

Attach old trees to new trees based on them so that we have access to
type and position information during the transformation. This allows
the following improvements:
 - error messages with correct position information
 - being able to tell the user when there is no instance of `Traverse`
   for the type they are trying to do effectful loops with
 - calling `Monad` and `Traverse` methods directly on the instance
   objects, rather than relying on e.g. `x traverse foo` to know
   we are trying to use the `traverse` syntax from the `Traverse`
   type class

Resolves #5 and #6.
Trap typecheck exceptions and don't print stack traces