Place bounds on all dependencies
This branch places version bounds on all dependencies, both to ensure that package builds are consistent and reproducible and to comply with Hackage's upload policies. Most of these bounds follow the scheme
>= x.y && < x.(y + 1)
which permits backwards-compatible changes as long as the dependency follows the Package Versioning Policy. The base
has slightly relaxed bounds as the frontend still builds successfully on GHC 8.10.