Replace annotation types with annotation instances

Currently `bind` takes an annotation type.

```
bind(SomeClass, withAnnotation: SomeAnnotation)
// this creates  new Key(SomeClass, SomeAnnotation);
```

This means that although you can pass arguments to an annotation, they will be ignored.

```
class SomeClass {
	SomeClass(@Event('change') Function eventEmitter) // the event type is lost
}
```



This PR changes `Key` and `bind` to accept an instance.

```
bind(SomeClass, withAnnotation: const SomeAnnotation())
// this creates new Key(SomeClass, const SomeAnnotation());
```


This makes `@Event('change')` possible and also cleans up existing code. For instance, the following

```
class SomeClass {
	SomeClass(@InjectAddress String address, @InjectName String name)
}
```

can be replaced with

```
class SomeClass {
	SomeClass(@Inject('address') String address, @Inject('name') String name)
}
```

This PR depends on #179. 
Don't merge it until #179 is merged and deployed.
Ok thanks for the info. Would using new throw ? (at least when assert are enabled)