Activator optimization: first stage - cache constructor and parameter routing info

First stage of our optimization is to create caching for constructors.
> We don't need a lock around TryGetValue though

Can `CreateInstance` be invoked concurrently? If so (and I think it can), you need a lock. A `Dictionary<TKey, TValue>` cannot be simultaneously modified and read at the same time.