Sampling Spanning Trees: Theory and Algorithms