Reifies arbitrary Haskell terms into types that can be reflected back into terms