is_zero and free_symbols modifications

see also #7662 

Integral's `is_zero`  processing is now more conservative and is moved to `_eval_is_zero`.

foo.is_number is equivalent to not foo.free_symbols but is a faster way of
arriving at that answer because is_number will fail if a single free
symbol is encountered. For this reason, the Integral.is_number routine
was modified.

Note: the first occurrence of `is_number` was

```
def is_number(self):
    """Returns True if self is a number (like 1, or 1+log(2)), and False
    otherwise (e.g. 1+x).""" 
    return len(self.atoms(Basic.Symbol)) == 0
```

foo.free_symbols should give any free symbols in the expression *as
written* without any regard to whether those symbols will disappear after
simplification of some sort. The test for is_zero was removed from
expr_with_limits calculation of free symbols for this reason.

Other comments about the rationale of these changes are in the test
suite (esp in test_basic) so that anyone changing the behavior will be
sure to see the desired state of affairs.
This looks same for Product and Sum.  Should we change the base class instead (ExprWithLimits, I think)?