Binding registration rewrite

The way that bindings are now stored keeps metadata information of the binding, like what constructor or provider is going to be used to create its instances. This will make it possible to analyze circular dependencies more easily.
API did not change at all as tests were left unchanged.