use a Rule class to make compiler/engine less scary.

This is still efficient since JS JITs are smart enough to not actually
create a dictionary for every class, but use hidden classes instead.

Test running time is unchanged.
add a CellPattern class to replace the heterogeneous cellrow lists
performance uneffected, all tests pass.
remove isLate and emptyRhs from Rule
add toJSON methods to Rule and CellPattern for standalone builds
fold propagateMovements/propagateLateMovements into one function
add methods on Rule/RulePattern, fold cell matching into RulePattern.matches
don't redraw for every mouse movement
add CellReplacement to combine lhs/rhs. minor perf improvement
refactor cell replacement into CellPattern, convert parseInt to constants (for perf)
make tests more flexible by checking for object names instead of bitmasks
rewrite replacements in terms of 'bits to clear' and 'bits to set'
use inplance operations for clarity
build CellReplacement Set/Clear bitmasks directly
fix bug where invalidated matches weren't properly skipped
make CellPattern be in terms of {objects,movements}{Present,Missing}
minor optimization: avoid replacements on some unchanging cells
needs more compiler work for better accuracy
unlimited objects 1: bitvectors -- tests 10x slower
unlimited objects 2: runtime code generation for CellPattern.matches
2.5x faster (~5x slower than baseline)
unlimited objects 3: use BitVecs in the compiler
unlimited objects 4: abstraction of object/movement state