7594: power rules correction so (x**y)**z != x**(y*z)

fixes #7594 ... and more.

Finally, I have consolidated exponent-joining rules and substitutions involving exp or Pow mostly in Pow's methods. There should never be an ad hoc test in the code base to see if some powers should combine: instead, call Pow._eval_power(power, ex) to see if power (=b**e) raised to ex can be written as b**(e*ex) or similar (in which case something other than None will be returned).

I've added my own comments to code changes to make review easier.