Use a priority queue to select compilers

The existing case-statement with nested if-statements is gross and hard
to extend. Replacing it with a priority queue simplifies the logic and
makes it very easy to add new compilers to the fails_with system, which
we will likely want to do in the future.
Decouple CompilerSelector from ENV
MacOS.viable_clang?