use variant rather than boost::any
Implement garbage collection of child objects and ensure that a
reference to an ancestor of an MO is sufficient to allow it to escape
collection.

Change-Id: I872d433e93d0fab8f641f5ebcdd98d6d97963334