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

First stage of our optimization is to create caching for constructors.
I apparently commented on an outdated diff, so I'm reposting and deleting the old comment.

This is not thread-safe. I see that you have a lock around the call to ContainsKey and Add, but you don't around the call to TryGetValue.

I suggest using a ConcurrentDictionary. I suppose that using a normal Dictionary might be faster if there is not much lock contention, but I would like to see real-world performance metrics involving multithreaded usage before making that decision.

If benchmarking shows locking is faster, I would suggest locking on a readonly field.

Is there another PR containing the perf tests for this? I thought we were going to write the perf tests first to get a baseline.