Okay, this helps some, but I can't find where we're using most of these.

What I can (I think) ascertain:
* `DeriveDataTypeable` lets us have the 'deriving (Typeable)`, but I don't see what benefit Typeable gives us; a stackoverflow answer seems to suggest Typeable is useful for delaying type checking to runtime, but that's as far as I got.
* Overloaded strings, if I'm understanding correctly is, why you can pass e.g. `"host"`, to `caaOption :: Config.Configured a => Text -> a -> IO a`.
* Multi-parameter type classes maybe are supported because they're needed by SnapletAcidState? Unclear. It doesn't seem we define any multi-parameter type classes ourselves.

The rest I don't really get at all. I have a sneaking suspicion `data FailedEvents = FailedEvents (IntMap.IntMap FailedEvent) Int` is using something in here but I'm not sure what. I vaguely remember something about Blaze or Snap requiring Template Haskell, I think?

Could you outline why each of these is included?