This would otherwise occur if nested calls are made that traverse the
same SPLOS. This keeps track of which SPLOSes are currently being
traversed, and if it's in use, it returns a clone.
It is incumbent on the calling code to release the semaphore directly
by calling $this->walking->detach($splos) when the traversal in
question is complete. (This is very important!)