remove unnecessary MugElement indirection

The whole dataElement, bindElement, and controlElement separation was a
source of unnecessary complexity in the spec system, widgets, and
elsewhere.

It led to lots of boilerplate like this:

  if (mug.dataElement) {
      // do stuff with mug.dataElement.someProperty
  }

Or

  if (!mug.dataElement) {
      // expects a control-only node.  Not very explicit.
  }

Now, there is only one property container, accessed like:

  mug.p.someProperty

And all accessing and setting of properties on it triggers model change
handlers.  This change basically isolates that code in one function.

Additionally, this enabled some changes to the mug type and spec
definition system that make it yet more declarative.

Fixes:

 fixes #100: shore up model change encapsulation

Also fixed at some point:

 fixes #113: copying choices doesn't generate a unique ID after the first copy
 fixes #15: Ability to change question type to/from label
add back handleMugRename() method in plugin interface
remove unused attribute
switch back to test page loading global dependencies without RequireJS
fix jquery-ui icon reference in test lib
fix toggling of constraint message
remove unneeded code
fix issues with errors

At some point recently, the support for showing icons in the tree next
to questions with errors may have broke.

This fixes that, but instead of the old.

In addition, it fixes pre-existing issues with that, including:

- If a question had multiple errors over time, multiple icons would get
  added.
- If a question was a container, the icon would display below all of its
  children instead of next to itself.

Other fixes:

    fixes #20: error message lingers even after deleting erroneous question

    (same fix, the warning when you edit XML for an invalid form did not
    account for invalid logic references.  More generally, errors is now
    part of the plugin interface.)