Constrained Sampling and Counting: Universal Hashing Meets SAT Solving