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
```

With a numeric base, 2 would not match 2.0 using 'is'...but I see that is how subs works in other places, so I will change this to use 'is'.

```
>>> cos(2*x).subs(2.,y)
cos(2*x)
>>> cos(2*x).subs(2,y)
cos(x*y)
```