Model iteration parser refactor

Best reviewed commit by commit, although files other than parser.js have minimal changes and can be reviewed on the PR. This is a refactor of the parsing logic that makes no functional changes (well, there are a few very minor differences, but they are very far out edge cases that shouldn't matter—I'll annotate them).

The idea is to clean up the parsing logic to make it easier to write plugins that contain custom mug types. As a proof of concept, all itemset parsing logic has been moved out of the core parser.js module into the itemset plugin.

Additionally, it is now possible for a mug type to intercept and manipulate retrieval of child nodes, both in the data and control trees. This means the existing `Repeat` mug type is no longer a special case with hard-coded logic in the control tree parser. Data tree child interception/manipulation is not used yet, but will be needed for model iteration.
The double-layer of abstraction is unfortunately complicated, but it allows consolidation of the common bits of parsing logic in these helper functions while providing a lot of flexibility to mug types that need to adjust the absolute path of a node (needed to lookup the corresponding data node's mug before it can be converted to the control mug type) or skip various parts of the process altogether.