thread locals instead of locks for vars in Types.scala

This is one of the changes suggested by Roland in order to reduce contention
caused by reflection GIL.

Locks optimized away here are indirectly used for such fundamental operations
as subtyping tests, so the optimization looks quite important.
replaces locks over numbers with AtomicIntegers

This is another optimization we discussed with Roland.
need to synchronize Symbols.recursionTable

Fixes this glaring omission of synchronization for a core part of Symbol.info.
makes all locks and tlses private and lazy

We do need lazy to be robust, because initialization sequence might
trigger synced operations in unexpected order, leading to NPE's.

Even if this is optimizable by removing some of the lazies or by
carefully reordering cake layers, there's no guarantee that all this
effort won't break after another reflection refactoring.