add literal keyword to evalf and use in assumptions

keyword "literal" will cause None to be returned if the
object cannot be evaluated to a literal number. The
attribute 'is_number' is often used to find out if something
can be evaluated to a number before attempting the evaluation,
but things like f(0) represent numbers (in an undefined sense)
that cannot be computed without knowing what f is.

So rather than

if foo.is_number and not foo.atoms(AppliedUndef):
  n = foo.evalf()
  if all(i.is_Number for i in n.as_real_imag()):
      pass

one can do

n = foo.evalf(literal=True)
if n is not None:
    pass
make free_symbols literal for expr_with_limits and products

free_symbols should not be smart; it should tell what free symbols
exist in the unsimplified expression being queried.
only call evalf if doit did something
modify is_comparable
add tests
add check for is_zero in re and im
7642: KroneckerDelta more judicious evalf; = 0 for nonzero diff
simplify Integral.free_symbols calc; clarify test

Also

    is_zero is needed to identify alternate *trivial* forms of 0 as
    in Integral(0, ...). It should never do more than look for a literal
    0 someplace. For this reason, the Integral.is_zero routine was modified
    and the advanced processing for other mostly trivial cases of an integral
    being 0 was moved to the doit method.