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.
Minor change in parsing behavior: previously the value used here was `nodePath`, which was a somewhat fuzzy value retrieved from one of the following attributes: `ref`, `nodeset`, `bind` (and maybe some other places too). See [getPathFromControlElement](https://github.com/dimagi/Vellum/pull/284/files#diff-6947033678b93d106e25614dd972e66fR543).

The (incomplete) [XForm spec](http://dimagi.github.io/xform-spec/#body-attributes) is disappointingly ambiguous, but notes that conventionally `<itemset>` nodes have a `nodeset` attribute.