implement moveDirAcrossDevice natively instead of shelling out to mv

closes #2