Highlight levels based on solvability.
Minor highlighting fixes; run two workers at once; if a worker runs out of iterations, run it again later on with a 'hint' comprising some sample of the open paths.
User-defined level-solving hints.
ctrl-h shortcut to print out inputLog to console formatted as a hint
Optionally give processInput a backup to avoid excessive backupLevel() calls. Small tweaks to reduce GC churn on empty arrays.
Fix line-highlighting bugs
Rename centroids to more generic keys. Dummy out SFX data to slightly speed up processInput. Do not bother messing with RNG state yet; later, only do it for games without RNGs.
Reduce logging noise
Reduce allocations in engine.js.

* Especially target allocations that generate short-lived garbage.
* Non-rigidbody games should no longer allocate anything due to processInput except for undo backups
* Games with again rules will still generate one backup per `again` which will be thrown away immediately
  * In the future, this could be fixed by using a single scratchpad backup for again evaluation and providing a backupLevelInto() function.
  * It might also be possible to rephrase again slightly: "It can only trigger if something changed on this iteration through the rules", rather than "it can only trigger if something would change on a subsequent iteration through the rules". This would avoid duplicate calls to processInput (once with dontModify=true, once with dontModify=false) and reduce the number of required backups by 1 in the case where again rules are used.

The upshot of all this for automated solvers is a lot less frequent garbage collection churn, and user-facing speed improvements of around 20-30%.