The keys of `join` are container types ( e.g. `list`, `tuple` or `Add`, `Mul` if you wanted to get fancy).  I don't consider these to be leaves.  I consider them to be interior nodes.  `leaf` is called if the type of the input isn't in `join`.  It is the default case. 

`leaf` is necessary for `allresults`.  It would also be useful if, for example, you wanted to apply `sympy.rules.debug` to all of the functions.