Huge performance improvement

This patch uses the definition cache while the assembly is populating it.

The problem was that in a given assembly you may have two definitions, say A and B, where B depends on A. Instead of processing A definition and then share it with B, it's built twice: one for A definition itself, and another for B definition's dependency.

Therefore, we can see that the Assembly is traversing not only the whole object graph (that's necessary) but also all the subgraphs, building all definitions it finds along the way.

With this patch my app (~400 classes) went from:
- Launch time: 30 seconds
- Initial memory footprint: 90MB

to:
- Launch time: 0.045 seconds (**667x faster**)
- Initial memory footprint: 15MB (**6x lower**)