Getting smarter hash codes from setget objects

Until now the hash code of a generic setget object was simply
obtained by converting the object to a struct and generating
a hash using datahas.DataHash. This approach was indeed too
simple in many cases and failed when the generated structs
contained fields that should not be considered for hashing
purposes.

The new approach consists on calling get_hash_code recursively
whenever possible, and only if everything fails use struct().