7899 - is_real oo-recursion problem fixed

An underlying error in the is_real and is_imaginary routines
has to do with dealing with elements that are not known to be
0 or not. So if r is a real variable (I*r).is_real should be
None because it could be imaginary or 0. (This might be a good
reason to make 0.is_real = 0.is_imaginary = True.)

Fixing the few is_foo routines precipitated failures and other
fixes. One is to make sure that the as_real_imag doesn't lead to
infinite recursion. The other is to modify the RoundFunction routine
to entertain *possible* imaginary terms, e.g. (I*r).is_imaginary is
None but it actually could be 0 or imaginary and handling it as such
wouldn't break the return value of ROundFunction. So a test like
`foo.is_imaginary` should be `foo.is_imaginary or (I*foo).is_real`.
keep floor(i) unchanged if i is imaginary symbol [skip ci]
Improve Add/Pow._eval_is_imaginary handlers

fixes #4149
fixes #2920
Fixes #7886