Table-drive type checking for IR opcodes
The way type.cpp was handling return types wasn't quite
sufficient for multiple destinations and unfortunately added a step
that's easy to forget when you add new opcodes with the HasDest flag.
Also, assertions about operand types are too distributed through the
code. Pull everything into a central table, similar to hhbc.h. This
still leaves several opcodes without type signatures, since figuring
it out got a bit tedious for now. It did uncover a few documentation
bugs in ir.specification, though.