I don't understand the difference between leaf and join. join has keys that identify what leaves are recognized and the values indicate what should be done to them, right? What is the purpose of leaf, then?

I wonder if some of this is doable with epath

```
Help on function epath in module sympy.simplify.epathtools:

epath(path, expr=None, func=None, args=None, kwargs=None)
    Manipulate parts of an expression selected by a path.
```