While updating the documentation of "Control.Monad.Lift", I figured out how to get rid of the massive #ifdef that completely changed how MonadLiftControl works on earlier versions of GHC (due to the lack of closed type families).

This is something I'm very happy about, because I was dreading having to figure out how to explain why the interface changes. Now it doesn't, it's the same interface all the way back to GHC 6.10.

The implementation of this does make use of unsafeCoerce. What's nice though is that I use a wrapper called "coerce", which is #defined to either 'id' or 'unsafeCoerce', depending on the version of GHC we're using. The issue is that older versions of GHC aren't expressive enough (because they don't support type families) to express the types to make this safe. But because we use the same code on older and newer versions of GHC, and on newer versions "coerce" is 'id', if the program type-checks on newer versions of GHC, we can be confident that the code on older versions is safe too (even though it uses unsafeCoerce everywhere).

This commit includes several additions and tweaks to the documentation that I can't be arsed separating out into a separate commit.

Next I will probably merge "Control.Monad.Lift.Unsafe" into this module, seeing as the only reason for having it separate was because it used 'unsafeCoerce' anyway. It also makes sense from the point of view of making the API identical between different versions of GHC.