Prevent multiple threads simultaneously entering collect_garbage logic

Although collect_garbage is careful to lock self.sessions, there was nothing to prevent this same activity happening simultaneously on multiple threads.  The locking prevented data corruption (other than the occasional cannot remove from list exception).  Added additional logic to ensure that only one thread at a time enters the collection logic while also avoiding thread contention on other threads.