Moved unsafeBuiltins and forbiddenBuiltins (renamed to
unsupportedUnsafeBuiltins) outside makeBuiltinCallsSafe

This is to allow access to the list from new functions.
SafeArgTypes: moved the construction of safe argument types into its own class

This allow reusing the operation from other call sites.
Map unsafe builtin functions into safe builtin functions if they exist

Mapping is performed in three phases:

- First the declarations of builtin functions (both unsafe and safe)
are collected in runOnModule by comparing the function names with the
list of unsafe builtins. argsHasPointer and argsHasSafePointer are
used to determine which kind of function it is.
- Second a mapping from unsafe functions to safe functions is created
in makeUnsafeToSafeMapping by constructing a safe Signature from the
unsafe Signature and finding a matching function from the list of
safe functions.
- Finally the association is passed over to makeBuiltinCallsSafe which
can consult the mapping before making other mapping decisions. The
function can simply check if the Function* exists in the mapping table
and if it does, replace it with the Function* associated to it (along
with the regular call site modification).

Potential issue: what if the code includes a new overloaded instance
of a builtin function? Is this legal? The signatures are not
whitelisted.