Suspend the world when cleaning up a domain as it's unsafe to walk the nursery with the world running.
Introduce MonoThreadInfo::inside_critical_region to avoid suspending threads that are
dealing with suspended threads. One cannot reliably suspend a thread in the middle
of inspecting another one without the risk of deadlocking.

It usually goes like this:

thread 2:
	suspend thread 3, thread 3 is in the middle of some critical code.

thread 1:
	suspend thread 2 while probing for state of 3;
	try to suspend thread 3, fail to resume since it's on critical code.
[runtime]Replace suspend safe locks with semaphores as darwin's implementation is not reliable.

	* mono-threads.c: On OSX, suspend safe locks are subject to a race condition
	where the lock is unlocked but a thread is blocked waiting for it.

	Semaphores are significantly slower as they always transition to the kernel, but given
	the two affected locks are taken very sporadically, there's nothing to worry here.
Add regression tests for the last 3 fixes.