Add `n()` 'smart' node constructor

This commit adds the `n()` node constructor which takes 1 or
more arguments.  The first argument is always interpreted
as the node value, any later arguments are inferred by type;
lists as lists of child nodes, dicts as dicts of attributes.
This gives us a bit of flexibility around what gets passed
and in what order.