Pretty print templates

Template: `{{#a}}{{#a}}<div>{{b}}{{b}}</div>{{b}}{{/a}}{{/a}}`

Before:

```javascript
function anonymous(dom,Placeholder
/**/) {
return (function (){
  var child0=(function (){
  var child0=(function (){
function build(dom) {
  var el0 = dom.createDocumentFragment();
  var el1 = dom.createElement("div");
  var el2 = dom.createTextNode("");
  dom.appendChild(el1, el2);
  dom.appendChild(el0, el1);
  var el1 = dom.createTextNode("");
  dom.appendChild(el0, el1);
  return el0;
}
var cachedFragment;
return function template(context, env, contextualElement) {
  var dom = env.dom, hooks = env.hooks;
  if (cachedFragment === undefined) {
    cachedFragment = build(dom);
  }
  if (contextualElement === undefined) {
    contextualElement = dom.document.body;
  }
  var fragment = dom.cloneNode(cachedFragment, true);
  var element0 = fragment.childNodes[0], morph0 = dom.createMorph(element0,-1,0), morph1 = dom.createMorph(element0,0,-1), morph2 = dom.createMorph(fragment,0,1,contextualElement);
  hooks.content(morph0, "b", context, [], {escaped:true}, env);
  hooks.content(morph1, "b", context, [], {escaped:true}, env);
  hooks.content(morph2, "b", context, [], {escaped:true}, env);
  return fragment;
};
}());
function build(dom) {
  var el0 = dom.createDocumentFragment();
  var el1 = dom.createTextNode("");
  dom.appendChild(el0, el1);
  var el1 = dom.createTextNode("");
  dom.appendChild(el0, el1);
  return el0;
}
var cachedFragment;
return function template(context, env, contextualElement) {
  var dom = env.dom, hooks = env.hooks;
  if (cachedFragment === undefined) {
    cachedFragment = build(dom);
  }
  if (contextualElement === undefined) {
    contextualElement = dom.document.body;
  }
  var fragment = dom.cloneNode(cachedFragment, true);
  var morph0 = dom.createMorph(fragment,0,1,contextualElement);
  hooks.content(morph0, "a", context, [], {context:context,types:[],hashTypes:{},hash:{},render:child0,escaped:true,morph:morph0}, env);
  return fragment;
};
}());
function build(dom) {
  var el0 = dom.createDocumentFragment();
  var el1 = dom.createTextNode("");
  dom.appendChild(el0, el1);
  var el1 = dom.createTextNode("");
  dom.appendChild(el0, el1);
  return el0;
}
var cachedFragment;
return function template(context, env, contextualElement) {
  var dom = env.dom, hooks = env.hooks;
  if (cachedFragment === undefined) {
    cachedFragment = build(dom);
  }
  if (contextualElement === undefined) {
    contextualElement = dom.document.body;
  }
  var fragment = dom.cloneNode(cachedFragment, true);
  var morph0 = dom.createMorph(fragment,0,1,contextualElement);
  hooks.content(morph0, "a", context, [], {context:context,types:[],hashTypes:{},hash:{},render:child0,escaped:true,morph:morph0}, env);
  return fragment;
};
}())
}
```

After:

```javascript
function anonymous(dom,Placeholder
/**/) {
return (function() {
  var child0 = (function() {
    var child0 = (function() {
      function build(dom) {
        var el0 = dom.createDocumentFragment();
        var el1 = dom.createElement("div");
        var el2 = dom.createTextNode("");
        dom.appendChild(el1, el2);
        dom.appendChild(el0, el1);
        var el1 = dom.createTextNode("");
        dom.appendChild(el0, el1);
        return el0;
      }
      var cachedFragment;
      return function template(context, env, contextualElement) {
        var dom = env.dom, hooks = env.hooks;
        if (cachedFragment === undefined) {
          cachedFragment = build(dom);
        }
        if (contextualElement === undefined) {
          contextualElement = dom.document.body;
        }
        var fragment = dom.cloneNode(cachedFragment, true);
        var element0 = fragment.childNodes[0];
        var morph0 = dom.createMorph(element0,-1,0);
        var morph1 = dom.createMorph(element0,0,-1);
        var morph2 = dom.createMorph(fragment,0,1,contextualElement);
        hooks.content(morph0, "b", context, [], {escaped:true}, env);
        hooks.content(morph1, "b", context, [], {escaped:true}, env);
        hooks.content(morph2, "b", context, [], {escaped:true}, env);
        return fragment;
      };
    }());
    function build(dom) {
      var el0 = dom.createDocumentFragment();
      var el1 = dom.createTextNode("");
      dom.appendChild(el0, el1);
      var el1 = dom.createTextNode("");
      dom.appendChild(el0, el1);
      return el0;
    }
    var cachedFragment;
    return function template(context, env, contextualElement) {
      var dom = env.dom, hooks = env.hooks;
      if (cachedFragment === undefined) {
        cachedFragment = build(dom);
      }
      if (contextualElement === undefined) {
        contextualElement = dom.document.body;
      }
      var fragment = dom.cloneNode(cachedFragment, true);
      var morph0 = dom.createMorph(fragment,0,1,contextualElement);
      hooks.content(morph0, "a", context, [], {context:context,types:[],hashTypes:{},hash:{},render:child0,escaped:true,morph:morph0}, env);
      return fragment;
    };
  }());
  function build(dom) {
    var el0 = dom.createDocumentFragment();
    var el1 = dom.createTextNode("");
    dom.appendChild(el0, el1);
    var el1 = dom.createTextNode("");
    dom.appendChild(el0, el1);
    return el0;
  }
  var cachedFragment;
  return function template(context, env, contextualElement) {
    var dom = env.dom, hooks = env.hooks;
    if (cachedFragment === undefined) {
      cachedFragment = build(dom);
    }
    if (contextualElement === undefined) {
      contextualElement = dom.document.body;
    }
    var fragment = dom.cloneNode(cachedFragment, true);
    var morph0 = dom.createMorph(fragment,0,1,contextualElement);
    hooks.content(morph0, "a", context, [], {context:context,types:[],hashTypes:{},hash:{},render:child0,escaped:true,morph:morph0}, env);
    return fragment;
  };
}())
}
```
I added \n's because it's easier to read the generated morphs. I added the var's so you can put a breakpoint on the morph creation (not that big of a deal). The difference is

```javascript
var fragment = dom.cloneNode(cachedFragment, true);
var element0 = fragment.childNodes[0];
var morph0 = dom.createMorph(element0,-1,0);
var morph1 = dom.createMorph(element0,0,-1);
var morph2 = dom.createMorph(fragment,0,1,contextualElement);
```

```javascript
var fragment = dom.cloneNode(cachedFragment, true), element0 = fragment.childNodes[0], morph0 = dom.createMorph(element0,-1,0), morph1 = dom.createMorph(element0,0,-1), morph2 = dom.createMorph(fragment,0,1,contextualElement);
```