Rework how literals are handled.

Rather than having multiple different operand types on the operations, we
just force operations to take registers and provide an operation for
loading a literal value into a register.

This simplifies the model a bunch since now the handling of literals is
completely separated from the handling of operations. When we later lower
to LLVM IR we will collapse these back into direct constant operands via
constant folding.

This also includes the start of a new value/type system, and a stub
implementation of the constant number type since I needed something to
instantiate to flesh out the new model for literals.
Pass through the source range for the assignment in a decl.
Remove redundant methods from IR builder.
Change octal number syntax to 0o rather than just 0 prefix.

C's 0 prefix for octal is widely considered to be a mistake that trips
people up. An explicit "0o" prefix goes with "0x" and "0b" and makes it
much less likely that octal will accidentally be introduced.

This also fixes a pre-existing bug in the parser where fractions had to
be written as e.g. ".0" because "0.0" would cause us to try to parse
as octal.