semaphore: track separate waiters per OS thread (bitbucket #137)

https://bitbucket.org/eventlet/eventlet/issue/137

The eventlet Semaphore implementation doesn't work with OS Threads (including
when using eventlet.tpool).  Greenthreads from all threads waiting on the
Semaphore will get added to self.waiters.  Later when releasing, it's possible
try to switch to a greenthread in another Thread.  This causes a traceback
from greenlet on the waiter.switch().  Even when not getting a traceback,
there's no locking on 'waiters' and a deadlock can occur.

This patch adds locking and tracks waiters per Thread.  Only greenthreads
within the current Thread will be switched to and other Threads will be
notified via a Condition.