(WIP) Package Keys

This is a work-in-progress patch, soliciting comments.  "Package keys" are a refinement of package IDs which record not only package name and version, but also a hash of the dependencies of the package in question. This means it is possible to refer to multiple copies of a package with the same version, but different dependencies, and even to compile them together.

The general approach is to compute a package key for a package during the configure step, and store it in the local build info. The current representation of a package key is md5(pkg-name "-" pkg-version "@" sorted-transitive-pkg-dep-ids). We also support old style package keys which are simply package IDs.

NB: Ignore the reexported-modules patch, it came along for the ride because I was doing development off of my main branch.

RFC: Package key parser assumes that no one will write a package key which
is a 32-bit hex string intending it to be an old-style ID.  I think this
is reasonable.

RFC: Should the package key's dependency list include internal dependencies
of the package?

ToDo: Add a few characters of the package name so that these keys are more
human friendly

ToDo: Move readHexFingerprint into GHC.Fingerprint

ToDo: Proper version detection

ToDo: Adjust dependency solver so that it does not decide packages with
different dependency trees results in unsatisfiable result, and add some
tests to this order