Recursive value descriptions

This implements support for recursive value descriptions.  Before, they would cause infinite recursion in the initialization of the value description.

It's done by using shared value descriptions (calling getDefaultDescriptionShared instead of getDefaultDescription), and by splitting initialization into two phases: one where the object is created and registered, and a second where it is initialized (where it may need its own value description if it's a recursive structure).

A test was added to value_description_test.