Update and clean-up the implmenation of GHC.TypeLits

* Replace class `SingI` with two separate classes: `KnownNat` and `KnownSymbol`

* Rename `magicSingId` to `magicDictId`.

* Simplify and clean-up the "magic" implementation.  This version makes
  a lot more sense, at least to me :-)

* Update notes about how it all works:

  Note [KnownNat & KnownSymbol and EvLit] explains the evidence for the
  built-in classes

  Note [magicDictId magic] explains how we coerce singleton values into
  dictionaries.  This is used to turn run-time integers and strings into
  Proxy singletons of unknwon type (using an existential).