Extensive, backwards-compatibility breaking redesign.
- This library no longer uses subclasses. Instead, a `Registry()` object is created and `async def` functions are registered with that registry. The `registry.resolve(fn)` method is then used to execute functions with their dependencies. [8](https://github.com/simonw/asyncinject/issues/8)
- `Registry(timer=callable)` can now be used to register a function to record the times taken to execute each function. This callable will be passed three arguments - the function name, the start time and the end time. [7](https://github.com/simonw/asyncinject/issues/7)
- The `parallel=True` argument to the `Registry()` constructor can be switched to `False` to disable parallel execution - useful for running benchmarks to understand the performance benefit of running functions in parallel. [6](https://github.com/simonw/asyncinject/issues/6)