This is the list of things you need to do to add a new IR node.

* All nodes

 - Add the node in Scala as a case class extending IR / TableIR /
   MatrixIR / BlockMatrixIR. Use scala collections so that case class equality works
   as expected (no java arrays).

 - Add the node in ir.py / table_ir.py / matrix_ir.py / blockmatrix_ir.py

 - Extend Pretty in Scala to print the IR.  Add `render` in Python.
   Add the IR to the IR parser.

 - Add an example to the Python test IRTests.

 - Add an IR generator to the pretty/parser test suite in IRSuite.

 - Add a test case to IRSuite, TableIRSuite, MatrixIRSuite, or BlockMatrixIRSuite to test
   the node’s behavior.

 - Check all cases involving missingness.

 - Add support for the IR in PruneDeadFields

 - Add any optimizations to Optimize,
   - In particular, any simplifying rewrite rules to Simplify

* (value) IR

 - Add a rule to Typecheck

 - It must define its type inference rule in InferType/InferPType

 - Support it in Children and Copy

 - Implement it in Interpret or add it to Interpretable as false

 - Implement it in Emit (the compiler) or add it to Compilable as false

 - If it binds a variable, add support to Bindings

* MatrixIR

 - Define copy, partitionCounts, columnCount, typ, and execute

 - add to LiftLiterals if necessary

* TableIR

 - Define copy, partitionCounts, typ, and execute

 - add to LiftLiterals if necessary

* BlockMatrixIR

 - Define copy, typ and execute

