Refactor: change sim state rep for runqueue and blocked threads
Previously we used a runqueue of thread values, and a separate map of blocked threads by thread id.
Now we use a runqueue of just thread ids, and a threads map that maps all thread ids to their thread value.
This is more uniform, and will be especially helpful when we get to more advanced operations like async exceptions where we need to alter threads other than the current one, irrespective of whether it’s in the runqueue or is blocked.
Then for the important special case of the currently running thread, split the ‘schedule’ function into two: schedule and reschedule, where the former has a current thread and the latter does not but tries to find the next one to run before calling schedule again.