[Mono.Tasklets] Optimizations and contention fixes.

Previously, we stored a global hash table containing preserved
stacks. This meant that whenever we needed to save a stack or free
a continuation, we had to acquire a global lock while doing it.
This could easily cause contention when e.g. a few managed threads
run several thousand tasklets at once.

We now store the hash table in the continuation itself. This means
that we no longer need a lock to guard it, effectively removing
the contention. As a bonus, freeing continuations is now also
slightly faster as we can just discard the hash table instead of
having to go through a global hash table and removing only the
stuff a particular continuation cares about.