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
watch for pairs of imaginaries that control Mul sign
only process imaginaries in is_negative
only process literal imaginary in abs
quicker exit for Pow is_imaginary handlers
add some numerical handling to Pow imaginary/real/complex handlers
try use arg in Pow Imag/Real handlers
Revert "try use arg in Pow Imag/Real handlers"

This doesn't work because it requires arg to be calculated...and
arg uses the old assumptions.

This reverts commit c170854d7a2eb40cc13fb2eb1e3ef2ae3dd92f14.