Spurious wakeups v3

 Simpler and more correct handling spurious wakeups

My previous patch for handling spurious wakeups solved the issue in the
Event class, which was only a partial fix. This patch fixes the issue in
the Condition class, making it a true replacement for standard library
Condition, eliminating the Event class, and simplifying the code.

Condition keeps now the number of waiters and signals received, ensuring
that each call to notify() will cause only one waiter to return from
wait(), and all waiters return when calling notifyAll().
I don't think we can - nobody promise you that the wokeup thread will get the condition lock before you. We can test only after we finish notifying and waiting for some time. Waiting until all threads exit ensure that all of them wokeup.