some refactoring of the scheduler

- notify(Task) should really be part of the schedule(Task) function

- simpler produce/consume that depends on fewer task state variables
  and moves towards better interaction between scheduled and
  un-scheduled tasks

- the runnable flag now means !scheduled; will rename shortly

- simpler event loop. it no longer needs to test t.runnable; instead
  whenever control returns you automatically know to exit the loop

- task exit logic moved fully to task_done_hook

- the biggest problem in all of this is hacks to make produce and
  consume as fast as possible. going through the scheduler still costs
  about a factor of 2 over what's possible
  it turns out to be fairly simple to have produce/consume yield manually
  for performance, and yet interact smoothly with the scheduler. the only
  problem is handling the producer exiting. we might need custom exit
  hooks to handle this more generally.
implement more descriptive task states. fixes #5736

fortunately, we were already documenting that ``Task`` accepts a
0-argument function. now we take full advantage of this to simplify
the scheduler by dropping the behavior of passing arguments on the
first call to ``yieldto``.
finally a good implementation of produce and consume

the version we've had for a while was fast, but didn't provide fair
scheduling and was really complex.

the new version is fair, simple, and performs almost as well as the
old one in the easy case (1 consumer, producer not blocked on I/O).

the key was to isolate the function schedule_and_wait(), which allows
scheduling to be replaced with a direct yieldto() when possible. the
scheduler knows best how to do this; trying to replicate this logic
outside the scheduler is awkward.
Merge branch 'master' of github.com:JuliaLang/julia into jb/scheduler_update
wait() no longer needs current_task()
Merge branch 'master' of github.com:JuliaLang/julia into jb/scheduler_update
fix some task state issues
Merge branch 'master' of github.com:JuliaLang/julia into jb/scheduler_update