Several improvements to random_rewire() / random_graph()
This introduces several simplifications and corrections to the graph rewire algorithm, to guarantee unbiased sampling. Now a move is outright rejected if it produces a self-loop/parallel-edge, instead of retried. This also adds a "non-sweep" mode, where edges are rewired randomly, possibly with repetition. The edge moves are now simplified to the target of the edges only, since swaping sources is redundant. The number of iterations can now be explicitly modified, so it is not necessary to call the function more than once, and it is emphasized in the documentation that only after sufficiently many iterations can the graph be guaranteed to be fully mixed.