Include ()'s in latex conversion of Implies
additional test of latex Implies grouping
fix sign to recognize sqrt with negative arg
watch for sign change from I in sign()
simplify sign code, watch for recursion
add sign.is_(nonnegative|nonpositive)
Deprecate set.is_real property, use set.is_subset(Reals) instead

fixes #6212
minor docstring edit [skip ci]
expand sign docstring to reflect its complex nature
bug fix in dup_zz_zassenhaus for issue 8037
Merge pull request #8038 from pernici/factor4

bug fix in dup_zz_zassenhaus for issue 8037

fixes #8037
Merge pull request #8014 from zanzibar7/bool_latex

Include ()'s in latex conversion of Implies
simplify Mul._eval_is_negative routine
simplify Mul._eval_is_even
Merge pull request #7996 from skirpichev/remove-is_real-for-sets

Deprecate set.is_real property, use set.is_subset(Reals) instead
Merge pull request #8028 from smichr/sqrtsign

sign(sqrt(1-sqrt(2))) -> I instead of being unevaluated
Merge pull request #8041 from skirpichev/8008-fix-v2

Fix #8008 (v2)
Merge pull request #8044 from smichr/isneg

simplify Mul._eval_is_negative routine
bounded and unbounded are not antonyms

tt is currently possible to create a meaningless set of assumptions:

neither
    Dummy(zero=True, bounded=False) nor
    Dummy(zero=True, unbounded=True)
raise an error.

If we assume finite == !unbounded in assumptions, we
create an alias: finite=False is the same as unbounded=True
and vice versa. We don't want to do that. What we want is
behavior like integer and noninteger:

Dummy(integer=0) is not the same thing as Dummy(noninteger=1).
A noninteger is commutative, complex, hermitian, noninteger,
nonzero, and real while integer=0 is only commutative -- nothing
else is known about it (other than that it is not 0).

/!\ In general, it is much easier to comprehend what one means
by using only true attributes to desccribe it. If something is
not zero but still complex, say nonzero=True instead of zero=False.

So assumptions.py has been modified to make the following true:

```
finite   : 0 < abs(x) < oo
bounded  : 0 <= abs(x) < oo
unbounded : abs(x) == oo
```

The same is also true for zero and nonzero. If nonzero is True you
are talking about a complex number that is not zero. But if zero is
False you are only talking about a commutative object that is not
zero.

In addition, we now use is_unbounded = True not is_bounded = False
in the few places where this is defined. The former is an affirmation
of what the object *is* not an indication of what it is not.
make sure nonzero.is_complex is True