libmn: move to work-stealing distributed scheduler

Instead of eagerly distributing work across workers when
a thread is scheduled, each individual worker now steals
work from other workers when it's queue goes empty. This
reduces the amount of cross-worker communication /
synchronization / contention while still maintaining a good
balance of load.