Add support for defining 'lazy attributes' on nodes

These are predefined in the node attributes with a sentinel value.
The first the key is accessed (via the node), the attribute will be
evaluated. Each lazy attribute corresponds to a property or method on
the node instance, e.g. node['foo'] -> node.foo().

This ensures attributes are accessible on the node, but prevents costly
attributes to be evaluated on initialization.
Add api.Node set, del, and serialize proxies
Add missing __delitem__ on base.Node
Implement base.Node.relid for getting a relative id to some root

The ID_SEPARATOR has been defined for visibility and is now a forward
slash rather than a period.
Add initial tests for api components

Add BackendTestCase to handle skipping tests if an unsupported backend
is detected. The subclass 'backend_path' must be specified which is the
absolute import path to the backend. The `backend` property will be set
on the class for use throughout the tests.
Add tests for the delimited backend client