optimize the fiber scheduler

To avoid scanning the whole waiting queue each time checking the ready fibers, I added some variables to the worker fiber. While the fiber is changed to ready, the fiber in the queue will be moved to the head of the queue so that it can pass the check for ready. In this way, the fibers in the waiting queue always ordered by the wakeup time and the ready fibers always before unready fibers. So we can break early while scanning the waiting queue.