Interpolation specifics defined in defaults

Signed-off-by: martin f. krafft <madduck@madduck.net>
Provide utils.DictPath

DictPath is a class used to represent "paths" to values in nested
dictionaries. This works around Python's limitation of not being able to
assign to the variable pointed to by a reference. It's used to translate
variable strings like ${foo:bar} into locations in the parameters
dictionary.

Signed-off-by: martin f. krafft <madduck@madduck.net>
Provide utils.RefValue

RefValue encapsulates string parameter values and can be used to isolate
and resolve references to other parameter values.

Signed-off-by: martin f. krafft <madduck@madduck.net>
Implement Parameter interpolation

Parameters can now reference each other, and resolution happens in
topological order. This is done in two steps: while merging already
walks the entire dictionary, a list of references and their occurrences
is kept. After merging is complete, interpolate() is called on the
instance, which recursively resolves the references found during
merging. If a referenced value itself contains other references, those
are resolved first (which is the topological ordering).

Signed-off-by: martin f. krafft <madduck@madduck.net>
Interpolate Parameters after merging from storage

Following the merging of parameters, the storage base class now invokes
interpolate() on the Parameters instance (via the Entity) instance.

Signed-off-by: martin f. krafft <madduck@madduck.net>
REAMDE maintenance

Signed-off-by: martin f. krafft <madduck@madduck.net>
TODO and README.Hacking maintenance about testing

Signed-off-by: martin f. krafft <madduck@madduck.net>