Atomic schedule

Here is a possible fix for #437.  It atomizes the `schedule=` method so the clear_schedules and set_schedule are all in one pipeline.
The best way I've found to brute-force threaded concurrency is with `Thread::pass`, not `Kernel#sleep`:

~~~ ruby
processes.times.map do
  Thread.new do
    Thread.pass if Random.rand(100) > 50
    # the threaded code to test
  end
end.map(&:join)