Using GADTs for reification of monads, and other structures