Support serializing objects with circular references
Storage Explorer serializes many objects to facilitate multi-process communications. To pass exceptions across process boundaries, Storage Explorer uses the ExceptionSerializer class to serialize and deserialize exceptions. The serialization process requires objects to contain no cyclical references. For most situations, this works just fine, because these exceptions are internal, and their structure can be controlled. However, sometimes an exception we have no control over, such as one thrown by a 3rd-party library, will contain cyclical object references. This can result in some very cryptic behavior.
Since we have no control over these kinds of exceptions, we should add support to ExceptionSerializer for circular references.