improved factorization of integer polynomials

Optimized loop over subsets in ``dup_zz_zassenhaus`` and attempted to choose ``p``
such that there are  fewer factorizations over Z_p[x].

For example

```
>>> minpoly(S('sqrt(1 + 2**(1/5)) + 2**(1/5)*sqrt(1 + 2**(1/5))'), x)
x**10 - 5*x**8 - 20*x**6 - 280*x**4 - 55*x**2 - 27
```

in this PR takes 1.7 seconds on my computer, in master much longer, 10 minutes.