Refactor generation sampling parameters (e.g. top k, temperature) into "Sampling" classes
#4164 has a full description of the intention here. Basically, to avoid exploding `generate(...)` with more arguments, I've added one generic `Sampler` parameter that allows for arbitrary transformations of the generation probability distribution conditioned on the past. This allows users to specify custom ways of sampling (e.g. insert a specific token after a previous one, etc.) 

In the process, I've added some basic tests around these samplers; existing tests pass otherwise. 
(Replaced merge with rebase -- see #5420)