We now lock here to get a list of runnables which were in the queue.  This makes the clearTasks call a bit more expensive, but I don't expect us to use this very frequently.  It makes things easier in the SingleThreadScheduler to get the task queue on the shutdownNow call.

Let me know if you see any reason why we would need to keep this more efficient.