Copy a value recursively.
If the result value is changed destructively (only possible for
multisets, arrays and mappings) the copied value will not be changed.
The resulting value will always be equal to the copied (as tested with
the function equal() ), but they may not the the same value (as tested
with `==() ).