perf(view factory): Compute DI Keys ahead of time

4% improvement in TreeComponent benchmark

For #1081

Closes #1085
feat(element binder): Use a child scope instead of Scope.watch(context:o)

This is the only place where Scope.watch(context:o) is used and it is
in the way of optimizations.

For #1086
feat(scope): Remove Scope.watch's context parameter.

BREAKING CHANGE

Scope.watch can no longer switch context.  Instead of saying

    scope.watch(expression, (v, _) { }, context: o);

Create a new isolate child scope

    scope.createChild(o).watch(expression, (v, _) { });
refactor(Scope): Pull ASTParser out of Scope into it's own library

For #1086
chore(ASTParser): Clean up and refactor the ASTParser

-> Make it injectable
-> Remove try/catch statements are extra state
-> Rename AstParser -> ASTParser
-> Rename ExpressionVisitor -> _ExpressionVisitor

For #1086
feat(scope): Expose Scope.watchAST as a public API

For #1086
feat(compiler): Precompute Scope.watch AST for TextMustache

For #1086
feat(compiler): Pre-compile Scope.watch ASTs for attribute mustaches

For #1086
feat(compiler): Precompute Scope.watch ASTs for bindings

For #1086