WIP Minibatch reassignment fixes

This should address the remaining issues of #2185 including #2611 (which I only saw after writing this).
I still have to merge #2185 for the tests to pass. I thought about using sampling from np.random instead of coding up a new function to do multinomial sampling with replacement (which should exist).