Typecast Poly to PurePoly in RoofOf._new, fixes #7876
Improve Add/Pow._eval_is_imaginary handlers

fixes #4149
fixes #2920
Fixes #7886
7895: watch out for new atan2 in solve

When accepting real and imaginary parts of an equation, discriminate
against additional atan2 terms, too. I'm not sure that recording what
was already present is necessary, but it seems like a good idea to
not reject a splitting into real and imag as long as no *new* re, im,
arg or atan2 are introduced.

The test for issue 6121 was changed to a simple assertion since the
original issue involved an infinite recursion. The new result is
a little different than the old result but there is no error.
Merge pull request #7900 from smichr/7895

7895: watch for new atan2 upon splitting equation into real and imag parts
Add._eval_is_imaginary: handle cases when args have different signs
Merge pull request #7879 from skirpichev/7876-fix

Typecast Poly to PurePoly in RoofOf._new
Merge pull request #7887 from skirpichev/4149-fix

Improve Add/Pow imaginary assumption handlers
minor tweaks
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
correct inline note [skip ci]
undo trivial reodered expressions in tests [skip ci]
responding to review
watch for pairs of imaginaries that control Mul sign
only process imaginaries in is_negative
only process literal imaginary in abs
quicker exit for power is_imaginary handlers and numeric handling
clean up Mul._eval_is_real and improve Mul._eval_is_imaginary