dpd_object: Implement new copy semantics and shared cache

This will greatly speed up variational analyses which must
make copies of DPD objects. Under the new copy semantics,
only the tree reference and a _shared dictionary object_ is
copied to the new dpd object. Thus, if _any_ copy of the object
must do a TTree lookup, all objects will receive the update.

The downside of this commit is that we must use a try/except
to check for items in the dictionary on getattr. In instances
where the object is _not copied_, this method is slower than
the setattr() method.