Controlling what symbols are exported using visibility annotations at
the source level doesn't work very well, because those annotations are
non-standard. The annotations differ subtly from compiler to compiler,
and as a result it's difficult to obtain the same ABI using all compilers.
By defining an explicit list of symbols, we control exactly which symbols
are exported in all cases and we can eventually get rid of visibility
annotations in the source.
Note that this commit only provides such explicit control when building
on Apple platforms. Support for Linux will be coming later.