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. The worst case scenario is that a couple of threads at the beginning evaluates the same factory but only 1 of them got to add it to the dictionary. We would have gotten the same worst case behavior if we use ConcurrentDictionary, because the real solution of that race condition is to lock around the whole factory creation as well. So overall, I think we paid a small price for not locking around the expensive factory creation code.

I don't know if I like using ConcurrentDictionary here. The code as-is isn't really that messy. There's only technically 1 extra line (the lock) for the exactly same behavior