Include tracebacks in errors messages

Signed-off-by: martin f. krafft <madduck@madduck.net>
Do not use instance of dict() as default for seen

Classic mistake:

  def foo(arg={}):
    …

this will instantiate a dict and use *the same instance* on subsequent
invocations, i.e. as if you used foo.arg inside the function.

Instead, instantiate the dict() in the function body!

Signed-off-by: martin f. krafft <madduck@madduck.net>
Fix parameter interpolation across merged lists

This was easier than thought. The problem:

   If two lists are merged (extended), and those lists use RefValues,
   then expansion (interpolation) won't work. The reason is that the
   DictPath includes the list indices, e.g. apt_repos:0:uri and those
   indices start at 0 for every list. Now, when two lists are merged,
   the reference to the base RefValue (in Parameters._occurrences) is
   overwritten by the RefValue of the mergee, causing it to not get
   expanded later.

Instead of just updating self._occurrences, we can populate it as we
update scalars, and on extending lists, we can add an offset to the
index in the path of the mergee.

Still: DictPath should go. One day…

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