Tree strategies

This PR introduces a simple strategy 

`minimize` - tries several functions and returns the answer that minimizes an objective function

It also introduces a function

`treeapply` - apply functions to recursive containers (trees)

It then uses `treeapply`, `minimize`, and `chain` to implement `greedy` a function to execute a tree of function calls, greedily making choices to optimize an objective function.  Trees are like `[(f, g), h]` which means "run f or g, whichever is better, then run h"

    Textual examples
    ----------------

    Text: Run f, then run g, e.g. ``lambda x: g(f(x))``
    Code: ``[f, g]``

    Text: Run either f or g, whichever minimizes the objective
    Code: ``(f, g)``

    Text: Run either f or g, whichever is better, then run h
    Code: ``[(f, g), h]``

    Text: Either expand then simplify or try factor then foosimp. Finally print
    Code: ``[([expand, simplify], [factor, foosimp]), print]``


`treeapply`, `multiplex`, and `branch.chain` are used to implement `brute` a function to execute a tree of function calls and optimize over all possible results. 

I recommend looking at the docstring for `greedy`, then `treeapply`