Synchronizing IO manager and waiting threads.

Introducing a status field on the schedulable tasks to indicate
their IO needs status. This allows the IO manager thread to know whether
it should try to awaken the schedulable task or not.

IO_STATUS_UNKNOWN: the task is still determining if it needs more data or not
IO_SATISFIED: the task has the data it wants (don't wake it)
IO_UNSATISFIED: the task is (or will very shortly be) waiting