compiler: Lazily plan artificial procedures

This adds a new KnownArtificialProc abstract class that handles planning
functions at the last possible moment. If an artificial procedure is
only ever inlined this means we can skip planning the function and
emitting its IR

This should have no effected on the generated code at -O2, it just makes
the emitted IR easier to follow
full-test: Run GC debug enabled build last

This is the runtime version I prefer to develop against. If that test is
run last I don't need to recompile the runtime to get the GC debug
version again.