Make Expander inherit AbstractExpander

Previously RecursiveExpander avoided inheriting from Expander in favor
of composition. This required users to use both an Expander and a
RecursiveExpander depending on what they were doing with the properties.
However it turns out that it was not always clear when it was OK to use
just an Expander, it required being sure that all the referenced
properties were already expanded. Yet the Expander was the only class
providing object expansion so both classes were needed. These two
classes aren't really independent.

Redesign the expanders to consist of a full featured Expander, with a
public API, based on an AbstractExpander providing basic functionality
needed for expansion. This makes the Expander a single class to
interface with, which works easily without requiring expansion order
knowledge, all while still separating out base functionality into a
separate class from the more policy based class.

Change-Id: Ia1a3403ae4a43b683bb3f2f6f381bebbc3c2e997
1 file changed