Support alternative node constructors in `tree()`

This commit parameterizes `treant.tree()` to be able
to accept alternative node constructors.  This allows
us to extend the behavior of how the `tree()` method
parsers input data structures (e.g. to intepret lists/tuples/dicts
differently, in whatever input form the user likes).