Hydration refactor

Unravel mustache loop and hydrate function.

Also solidifying / making sense of helpers.

Example templates to give you an idea:

    {{foo}}<span></span>
    ...
    function template(context, options) {
      if (cachedFragment === null) {
        cachedFragment = build(dom);
      }
      var fragment = cachedFragment.cloneNode(true);
      var helpers = options && options.helpers || {};
      var placeholder0 = new Placeholder(fragment,0,1);
      helpers.CONTENT(placeholder0, "foo", context, [], {escaped:true}, helpers);
      return fragment;
    }

    <span>{{foo}}</span>{{foo}}
    ...
    function template(context, options) {
      if (cachedFragment === null) {
        cachedFragment = build(dom);
      }
      var fragment = cachedFragment.cloneNode(true);
      var helpers = options && options.helpers || {};
      var placeholder0 = new Placeholder(fragment.childNodes[0],-1,-1), placeholder1 = new Placeholder(fragment,0,1);
      helpers.CONTENT(placeholder0, "foo", context, [], {escaped:true}, helpers);
      helpers.CONTENT(placeholder1, "foo", context, [], {escaped:true}, helpers);
      return fragment;
    }

    {{foo}}<span>{{bar}}<a>{{baz}}<em>{{boo}}{{brew}}</em>{{bat}}</a></span>
    <span><span>{{flute}}</span></span>{{argh}}
    ...
    function template(context, options) {
      if (cachedFragment === null) {
        cachedFragment = build(dom);
      }
      var fragment = cachedFragment.cloneNode(true);
      var helpers = options && options.helpers || {};
      var placeholder0 = new Placeholder(fragment,0,1), parent0 = fragment.childNodes[1], placeholder1 = new Placeholder(parent0,-1,0), parent1 = parent0.childNodes[0], placeholder2 = new Placeholder(parent1,-1,0), parent2 = parent1.childNodes[0], placeholder3 = new Placeholder(parent2,-1,0), placeholder4 = new Placeholder(parent2,0,-1), placeholder5 = new Placeholder(parent1,0,-1), placeholder6 = new Placeholder(fragment.childNodes[2].childNodes[0],-1,-1), placeholder7 = new Placeholder(fragment,2,3);
      helpers.CONTENT(placeholder0, "foo", context, [], {escaped:true}, helpers);
      helpers.CONTENT(placeholder1, "bar", context, [], {escaped:true}, helpers);
      helpers.CONTENT(placeholder2, "baz", context, [], {escaped:true}, helpers);
      helpers.CONTENT(placeholder3, "boo", context, [], {escaped:true}, helpers);
      helpers.CONTENT(placeholder4, "brew", context, [], {escaped:true}, helpers);
      helpers.CONTENT(placeholder5, "bat", context, [], {escaped:true}, helpers);
      helpers.CONTENT(placeholder6, "flute", context, [], {escaped:true}, helpers);
      helpers.CONTENT(placeholder7, "argh", context, [], {escaped:true}, helpers);
      return fragment;
    }