Keep track of the meaning of the CL fields using GADTs

The purpose of this change is to ensure the shiftCL/revShiftCL hack
doesn't mess up things (however it's not absolutely neccessary, as the
few occurences of these functions can be verified manually).
Re-unify lcr2rcl and rcl2lcr using a type class.
Generic IO wrapper and two simple instances
Make CrumbList a monad transformer
Implement IO in the interpreter using PrgmIO
Merge branch 'crumblist-gadt'