Extract cross-process locking from the scheduler into DistributedMutex