This has code for checking for various problems in packages. There is one
set of checks that just looks at a PackageDescription in isolation and
another set of checks that also looks at files in the package. Some of the
checks are basic sanity checks, others are portability standards that we'd
like to encourage. There is a PackageCheck type that distinguishes the
different kinds of check so we can see which ones are appropriate to report
in different situations. This code gets uses when configuring a package when
we consider only basic problems. The higher standard is uses when when
preparing a source tarball and by Hackage when uploading new packages. The
reason for this is that we want to hold packages that are expected to be
distributed to a higher standard than packages that are only ever expected
to be used on the author's own environment.

There are a range of severities, from merely dubious to totally insane.
All of them come with a human readable explanation. In future we may augment
them with more machine readable explanations, for example to help an IDE
suggest automatic corrections.

An issue that might not be a problem for the package author but
might be annoying or detrimental when the package is distributed to
users. We should encourage distributed packages to be free from these
issues, but occasionally there are justifiable reasons so we cannot
ban them entirely.

An issue that is OK in the author's environment but is almost
certain to be a portability problem for other environments. We can
quite legitimately refuse to publicly distribute packages with these
problems.

Sanity check things that requires looking at files in the package.
This is a generalised version of checkPackageFiles that can work in any
monad for which you can provide CheckPackageContentOps operations.

The point of this extra generality is to allow doing checks in some virtual
file system, for example a tarball in memory.