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 referenced
symbols. In reality, every use of `getGlobalPtr` knows the type of
the symbol it is requesting.

Instead of declaring aliases, we simply track which symbols we refer to
and, of those, which we have definitions for. References for which we
lack a definition we emit a declaration.

The only slightly tricky thing here is that LLVM treats declarations for
functions differently from other globals. Namely, while function
declarations use `declare` syntax,

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

Other globals are just definitions with `external` linkage,

    @extern_variable = external global i8
llvmGen: Improve error output