consolidate exp._eval_subs and Pow._eval_subs

builds off of #7638; only the last commit needs to be reviewed. Details are given in the last commit's log.

some differences
```
>>> exp(x+E).subs(E,2)
2**(x + E)  <------- now 2**(x + 2)

>>> (E**(2*x+3)).subs(E**(x),3)
9*exp(3)
>>> (a**(2*x+3)).subs(a**(x),3)
a**(2*x + 3)  <----------- now gives 9*a**3
```

Is there any specific reason to compare `func` by `is` method and `base` by `==`?