Introduce stronger typing in compiler

This change:
* Tracks types (not just value sizes) in the Compiler
* Where possible, drop type argument from Compiler methods (i.e. they can be inferred from the types of Values)
* Expand subroutines in Compile rather than handling them in Compiler (which was causing problems with type soundness)

I was planning on putting in some work to minimize the exception-handler tables in the case of subroutines - but based on the fact that we only generate four eliminatable exception ranges for the subroutines test, I decided it's probably not necessary.

Don't fear the ungodly-long list of commits here - they're all small, incremental changes.  This will make bisecting a pleasure, in case we hit problems in the future.  I've made sure that ci.sh (both arch=x86_64 and arch=i386) passes not only on the most recent commit but _every_ commit in between.