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().