Further improve interface performance

The per-node comment field has been removed and replaced by a global
grammar comment field. The node open/closed status is stored in a
separate object to avoid triggering the grammar cache update every time
a node is opened or closed.
Fix Vue error when trying to loop undefined array
Store exposed nodes in separate array

TODO: re-implement sanitize function
Add merge feature on import
Use Vue.nextTick for queueing view updates
Join grammar/transforms into common template
Add traverse.js tree traversal library
Sanitize grammar with traverse.js
Fix template issues
Remove empty grammar nodes
Update site text generator
Remove accidentally added generator executable
Fix probability for sentence strings
Refactor node cache to use traverse.js

The node cache has also been moved out of Vue, which vastly improves its
performance as Vue doesn't need to attach watchers to the cache object.
Update node watcher functions
Revert applyProbability changes
Remove buggy preview update for now
Update sentence string design
Style comment textarea
Fix transform filter node cache issue