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.
No, why do you ask?

```
>>> from sympy import *
>>> var('a b',bounded=False, zero=False, real=True)
(a, b)
>>> (a*b).is_zero
False
>>> (a*b).is_nonzero
True
```