haskell Extensible optionally-pure exceptions