def run_until(target_time)
      return if target_time < now
      
      loop do
        shred, relative_time = next_shred
        break unless shred
        break unless now + relative_time <= target_time
        run_one
      end
      
      # I hope rounding errors are okay
      fast_forward(target_time - now)
    end
def run_until(target_time)
      return if target_time < now
      
      loop do
        shred, relative_time = next_shred
        break unless shred
        break unless now + relative_time <= target_time
        run_one
      end
      
      # I hope rounding errors are okay
      fast_forward(target_time - now)
    end
runs shreds until the given target time, then fast-forwards to
 that time