llvmGen: Rework handling of forward references

Previously we assumed that all symbol references have a corresponding
`$alias` of type `i8*`. These aliases were generated and tracked in
`generateAliases` and `getGlobalPtr` in `Base.hs`. This was the case as
the code was pretending that it didn't know the types of reference
symbols. To the contrary, every use of `getGlobalPtr` knows the type of
the symbol it is requesting.

We eliminate these aliases, as well as the use of generic
`i8*` types. We do this by declaring proper function declarations
instead of forwarding all symbols through aliases.
For externally defined functions, we will
provide explicit declarations of the form,

    declare i8 extern_func(i8, i8, ...)

Here we will assume that each symbol has only one type (which seems
reasonable enough).

Needing the type is problematic as `getGlobalPtr` may not have seen a
definition for the requested symbol yet. It is used in several places,

    * `genLit` in `CodeGen.hs` in the case of a `CmmLabel` where we know
      the needed type
    * `getHsFunc'` in `CodeGen.hs` where we also know the needed type
    * `genStaticLit` in `Data.hs` where we know the type