Crack down on symbol exports from dylib/bin files

Before this commit, if a native static library were linked inside of a rust
library, then all of the symbols from the static library would be exposed. This
is normally not a desirable outcome.

This commit changes the behavior to exporting all *reachable* symbols. This
means that if a C library's symbols have been determined to be reachable, the
symbols will be exposed. Otherwise, they will all be hidden.

This is performed in a similar manner to the *.def.in files that we used to use
for librustrt. These files are dynamically generated based off the reachable
symbol list, and then passed to the linker as a list of symbols which need to
get exported.

In addition to being more strict about symbols, this also allows us start
running the --gc-sections and -dead_strip optimizations. These two optimizations
are incredibly helpful at cutting down sizes of static binaries because all of
the metadata sections are naturally removed. Note that these flags are *always*
passed at -O2 and above, and this works for everything because we conditionally
provide information to the linker that the metadata symbol is to be exported
(meaning that the gc sections and dead stripping don't remove it).

On OSX, a static library goes from 6.7MB to 1.2MB when generated without and
with optimizations now (because of the stripping of metadata).

I have seen no impact on compile times of small crates with this change, so I
believe that this is a good optimization to perform by default. Additionally, I
have found no problems in having --gc-sections or -dead_strip accidentally
removing unwinding metadata. The test suite continues to run normally.