Combinatorial generation via permutation languages