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.
they are removed; I change the `i` to `a` and now return None if the a.is_bounded is not True since in either case it *could* be oo and that would lead to its multiplication by 0 giving a nonzero value of None.