Implementation of deep-copy for arbitrary object trees in .NET