feat(ElementInjector): implement ElementInjector

Initial implementation of ElementInjector.

Works:
1. The creation of proto element injector trees
2. Bindings
3. The instantiation of element injectors
4. The instantiation of directives
5. Visibility: Parent and Ancestor
6. Delegation to application injectors
7. Error handling

Missing features:
1. Handling components.
2. Setting "special" properties (e.g., Element, View).
3. Cycle detection
4. Distance
5. Text nodes
This is ported from DI.js. 

DI.js injects by token. A token can be anything: a function/type, a string. Using type annotations is just syntax sugar.

So

```
class Component {
	constructor(service:Service);
}
```

is the same as:

```
class Component {
	constructor(@Inject(Service) service);
}
``

So `@Inject("service")` just looks for a binding with the token "service". 

I think this is better than the DI.dart approach because it makes certain types of injection less awkward.

```
bind(String, withAnnotation: new MeansAddress(), value: 'hello');
bind(Function, withAnnotation: new Event('click'));
```

Here although the types of both the bindings are technically used, we semantically use annotation instances. So the types are not really necessary.