fix is_zero detection on Mul._eval_is_* tests

Once a None is obtained for is_zero, it should no longer be updated.
The return value must consider the value of is_zero. This can
change if S.Zero.is_imaginary = S.Zero.is_real = True is ever true.

The routines were shortened a bit, too.
Small improvments for Mul._eval_is_real/imaginary

1. removed fuzzy_not import (it's redundant)
2. slight formatting changes
3. add an early exit if t is not a complex number
4. renamed: is_zero -> zero (like the real variable)
5. simplify "if real and is_zero is False" branch of _eval_is_real
Make Mul._eval_is_hermitian/antihermitian like Mul._eval_is_real/imaginary
Change is_integer/positive/real to _evals_is_* helpers
add Mul.is_nonzero handling
revert complex handling in Mul._eval_is_(real|imaginary)
fix Mul._eval_is_imaginary
simplify Mul.is_imaginary routine
clean up tests
simplify Mul.is_antihermitian routine