Асинхронный apply

**Синопсис**

Технология `bemtree.xjst` — генератор BEMJSON-дерева, с синтаксисом BEMHTM'я: 
* базовые шаблоны портированы из [bem-bl/i-bem__html](https://github.com/bem/bem-bl/); 
* грамматики и компилятор используется оригинальные, из bem-bl. 

**Подробно**

В отличии от bemhtml, **bemtree.xjst** — асинхронна. На вход ожидает, кроме начального контекста, функцию-колбек, вызываемую по окончании постороения дерева:

    require('./path/to/compiled.bemtree.xjst.js').BEMTREE.call(
      { data : 1 }, 
      { 
        callback : function(bemjson) { 
          console.log(JSON.stringify(bemjson, null, 2));
        }
      });

//синтаксис убогий, но по другому не получается, не форкая компилятор bemhtml (см. [bem-bl/.../bemhtml/api.js](https://github.com/bem/bem-bl/blob/master/blocks-common/i-bem/__html/lib/bemhtml/api.js#L41))//

Внутри шаблонов можно писать какой-нибудь асинхронный код:

    block page, content: {

        // сохраняем текущий контекст (только часть относящуюся к БЭМ-объекту: `this.block`, `this.elem` и пр.)
        // см. код i-bem.bemtree.xjst]
        var ctx = this.pause();

        // делаем что-то асинхронное, например удем в «ручку» промисами
        doSomethingAsyncP()
          .then(this.resume.bind(this, ctx, function(result) {
            // `this.resume()` востанавливает контекст из `ctx`

            this.ctx.content = apply(this._mode = '', this.ctx = result);
          })
          .done();

    }

**Пример** 

[См. код шаблона desktop.blocks/header/header.bemtree.xjst](desktop.blocks/header/header.bemtree.xjst)

    › git clone ...
    › npm install
    › bem make
    › node test.js

\cc @arikon @dfilatov @indutny