Implements Lennart's idea from the Haskell Symposium.

Users may use the special type function `TypeError`, which is

similar to `error` at the value level.

See Trac ticket https://ghc.haskell.org/trac/ghc/ticket/9637, and wiki page https://ghc.haskell.org/trac/ghc/wiki/CustomTypeErros