Separate return type from args with -> in nfi

This is more clear to read and gives more flexibility in extending the
syntax in the future
compiler: Add noreturn attrib for native functions

This has the same meaning as noreturn in LLVM - namely that the function
can throw exceptions but it cannot return normally. This lets us do a
quick teardown of our GC state instead of creating a GC barrier and
attempting to phi the GC state back together. It also passes the
noreturn attribute to LLVM to allow it to perform its own optimisations.

This was motivated by the use of (error) in (case-lambda). With this
change the generated IR is smaller and easier to follow.
compiler: Remove explicit value disposal

We now have an unconditional value disposal pass which will
automatically dispose unused values. More importantly, our identical
steps merging pass will not work correctly if a value is disposed
between two identical steps. Remove all manual disposal and let
automatic disposal do our work for us