Implement flexible target specification

Removes all target-specific knowledge from rustc. Changes the targets we
accept to:

arm-apple-darwin
arm-linux-androideabi

i686-apple-darwin
i686-pc-mingw64
i686-unknown-freebsd
i686-unknown-linux-gnu

mips-unknown-linux-gnu
mipsel-unknown-linux-gnu

x86_64-apple-darwin
x86_64-unknown-freebsd
x86_64-unknown-linux-gnu
x86_64-w64-mingw32

Closes #16093

[breaking-change]