Make deduce_alpha_implications() handle facts with Not

Previously implications like a -> !b, c -> b were not handled correctly to
deduce things like a -> !c. Now every fact a -> b adds the implication !b ->
!a, and deductions of the above for, as well as a -> b, !a -> c => !b -> c are
added.

The function still does not properly handle nested implications. That fix is
coming in a later commit.

This also changes rules_2prereq to add prerequisites in both directions (as
the docstring suggests). That is, if a -> b, a is a prerequisite of b and b is
a prerequisite of a.  This is because if a is true then b is true, and if b is
false then a is false.  This function takes its input from
deduce_alpha_implications, so making this change was necessary.
Use Warshall's transitive closure algorithm in deduce_alpha_implications

Unlike the existing algorithm, this correctly handles implications of
arbitrary depth, like a -> b, b -> c, c -> d, d -> e ==> a -> e.  It also
simplifies the algorithm quite a bit.
Old assumptions: replace !finite == infinite with infinite -> !finite

The motivation here is that there might be things that are neither finite nor
infinite, i.e., non-numbers. For example, I would expect anything with
commutative=False to be neither finite nor infinite.

This only changes the fact in assumptions.py, and does not fix any of the
remaining code in SymPy to match it.
Add Float._eval_is_infinite

!finite does not imply infinite, so this is needed to make
Float('+inf').is_infinite == True.
Update facts on oo, -oo, and zoo

Only add the facts that are necessary (namely, infinite, and positive and
negative for oo and -oo resp.). The other facts are deduced automatically by
the assumptions system.
Fix a test in test assumptions

!finite does not imply infinite, so the tests were changed to use
infinite=True instead of finite=False (so that the deductions of, e.g.,
(positive=True, infinite=True) + (finite=True) == (positive=True) still
work).
Merge branch 'master' into old-assump-modest
Raise NotImplementedError in _eval_interval if the limit returns a Limit

This causes tests from issue #4199 to continue to return an unevaluated
Integral instead of a nonsense result with Limit objects.
Implement Mul._eval_is_infinite

Knowing is_finite is not enough to know is_infinite, as both can be False. I
have used the rule that any product of infinites is infinite.  This may cause
issues because of oo*0 == nan (currently nan.is_infinite is None, but we might
want it to be False).
Fix a typo
modify Mul.is_infinite to watch for NaN

modify the limit routine to watch for any infinite arg
zero -> even & finite
Merge pull request #63 from smichr/pr

modify Mul.is_infinite to watch for NaN
raise errors on badly formatted assumptions

Errors are raised if there are not spaces around
& and | or if there *is* a space after '!'. This inflexibility
enforces readability on the input strings.
Check for Limit with isinstance instead of has in _eval_interval

This is better because the original expression might have contained a Limit.
With changes from #8340, this should no longer be necessary.
remove extra space [skip ci]
Merge pull request #64 from smichr/pr

raise errors on badly formatted assumptions
Merge branch 'old-assump-modest' of github.com:asmeurer/sympy into old-assump-modest
remove unused imports
Merge pull request #65 from smichr/pr

merge with master