Work around recursive locking on windows mutexes

It turns out that windows cricital sections will succeed in EnterCriticalSection
or TryEnterCriticalSection if the calling thread already owns the mutex, but
this is obviously bad for us because there could be two contenting green threads
on the same os thread.

With some extra checks of `self.held` in try_lock(), I believe that we can
circumvent this limitation with minimal impact to the mutex.