recognize b**(1/log(b)) and b**(1/(log(-b)+/-I*pi)) as E

The random test added will affirm this identity every time tests
are run. I already ran it several hundred times without error. The
code in power.py tries to fail quickly if it is likely that the
base and exponent don't match the target expression.
modify replace to truly act from the bottom up

Previously, replace would not target any subexpression in which
subexpressions were changed, so x*(x*y + 1) would become x*(2*x*y + 1)
if all Muls were being multiplied by 2. Now 2*x*(2*x*y + 1) would be
obtained.

Add more explanations to replace's docstring.
patterns in replace succeed only if complete
give replace a simultaneous option
define hashable content for Subs, Lambda, Integral, Sum and Product

The new definition allows expressions that would give identical
results (indepenedent of bound variables) to compare the same.

Issues 2440, 3775
make Lambda variables Symbol, not Dummy
test and sympify Lambda input
minor ode cleanup

the global declaration of y was moved to the top of the function
and update the inline comments in _handle_Integral which no longer
apply

retlist processing was handled as a list comprehension
consolidate sum-like methods; disambiguate 1 and 2 arg limits

Product and Sum now use the consolidated _as_dummy method.
Update AUTHORS
Update aboutus.rst
Remove duplicate line
Merge pull request #2076 from shikil/ntheory

Remove duplicate line
Merge pull request #2075 from rishabh-git/patch-2

Update aboutus.rst
Merge pull request #2071 from rishabh-git/patch-1

Update AUTHORS
Add Rishabh Dixit to .mailmap
Simplify Mul.as_real_imag() for imaginary multiplicands (issue 3329)
Fix failing diff test after Mul.as_real_imag() modifications (issue 3329)
Merge pull request #2042 from skirpichev/3329-mul-as_real_imag

Simplify Mul.as_real_imag() for imaginary multiplicands (issue 3329)
remove hashable content changes to Sum, Product and Integral