Make the constant propagation pass clearer and more effective.

We change the HIR to allow embedded literals.  Before this we would
optimize

    a := 5
    b := 2
    c := a + b
    d := X + c

to
    c := 7
    d := X + c

but now we can directly optimize it to

    d := X + 7

This change in the HIR structure also allows us to split up constant
folding (which was doing two things) into a pass that does the constant
propagation and one that does the actual semantic folding.
Partial check-in of the LIR module.

LIR (the 'L' stands for Low) is a second IR the HIR is compiled into.
Unlike HIR, each LIR opcode aims to be "easily" compilable to assembly;
for some definition of "easy".