Introduce a new type parameter 'l' for MonadLogger

This type parameter is the type of entries that will be
logged. Previously, MonadLogger would fix this to be LogStr, but this
makes it difficult to performed structured logging.

In this commit, the type parameter 'l' is added, and 'l' can be flexible
throughout logging. It's up to the log runner to interpret 'l' and
perform the necessary encoding. For example, if 'l' is chosen to be
'Text' then we could log to stdout, but if 'l' is a 'HashMap Text Text',
then we may be able to send a more structured log to a log daemon, or we
could encode this as JSON string for stdout.

A functional dependency is added to MonadLogger on 'm -> l' to aid type
inference. This functional dependency is the same as functional
dependencies used for MonadReader and MonadWriter.
Add mapLoggingTEntries

This function allows one to map over all log *entries* for a LoggingT,
with the possibility to change the type. This function is important to
allow LoggingT to be composed between different log requirements.

For example, a library might just use 'LoggingT Text m', while the
application itself might be using more structured logs. These logs can
be composed by using 'mapLoggingTEntries':

  mapLoggingTEntries (HashMap.singleton "MESSAGE")
    :: LoggingT Text m a -> LoggingT (HashMap Text Text) m a