extensive refactoring related to types

a lot of refactoring in preparation for making a non-shitty plugin
abstraction.

The main thing is that instead of

mugType.mug.properties.dataElement.properties.nodeID

it's now

mug.dataElement.nodeID

We're using a small JS library that implements class inheritance on top
of prototypes.  All the MugTypes (now Mugs) are defined using this,
and they each have this.get{Data,Bind,Control}ElementSpec() methods to
allow subclasses to override these.

Additionally

  - there's a new MugElement class encapsulates the setting, copying,
    and validation of element attributes.
  - all info about what mugs are valid children of other mugs is now
    encapsulated within the mug definitions, so the generation of jstree
    types is now a straight-up copying of the mug type definitions, and
    there is only one string used to refer to any given mug type
    throughout the code
  - had some trouble replacing existing mugType.typeSlug equality checks
    with mug instanceof MugClass checks due to the JS class library I'm
    using breaking instanceof or me possibly not understanding how to
    use it, so for now those checks remain as mug.__className === "foo"

There were also various other minor refactorings related to these
changes.
remove some unnecessary indirection in widget definitions
remove more unnecessary indirection in widget definitions

all sections simply return a list of property paths now.  Properties are
shown or hidden based on presence of the property definition + the
visibility attribute of the property definition.

If the visibility attribute is a path to another property, then the
property will be visible if that property is visible (this is used for
itext widgets -- the actual display toggling is handled by the id
widgets, though).
move/fix ODK-only question check
fix typo
extract remaining itext classes into higher scope
remove unused function
remove function I commented out because it was unused
cherry-pick a8e12fc561d3904d70e01525e40cca04753925a8

remove code that was never getting run
add a plugin system and start using it for itext

Add a PluginManager class that handles delegating method calls to
plugins.  Can either return an array of all the return values of all
plugins, or have all plugins sequentially process an input value.

Also adds a JavaRosa plugin for Itext.  At the moment I've moved the
itext definition and parsing, widgets, and properties into the plugin,
and am just explicitly referencing the plugin's itext model (which used
to be formdesigner.model.Itext) in the other parts of the code that
still reference Itext.

Now I will extract those other parts out as plugin hooks.
fix regressions from 0ec9384

removing the getItext() method without maintaining the existence check
for mug.controlElement before accessing labelItextID broke things.
itext plugin: integrate preserialize actions

add preSerialze function to the plugin interface and integrate itext
deduplication and removal of unlinked itext items into that.
itext plugin: integrate writing itext xml block

add a contributeToModelXML function to the plugin interface and
integrate it into the itext plugin
itext plugin: integrate section properties definition

add contributeTo{Main,Logic,Advanced}Properties() methods to the plugin
interface and implement them for the JavaRosa plugin.

Also move JR Preload stuff to the JavaRosa plugin.
only show 'Special Hidden Value XMLNS attribute' for data nodes'
itext plugin: integrate form errors

add a getFormErrors() method to the plugin interface and move global
itext errors (which have to do with languages not being present in the
form, which probably isn't going to happen anyway if adding/removing
languages is not enabled).
itext plugin: integrate tools menu items

add getMenuItems() function to plugin interface and integrate itext bulk
translations