Deep replicate the incoming object and return a fully independent copy.
The returned object can be mutated without any consequence to
the originating object.
Shallow replicate the incoming object and return an semi-independent copy.
The returned object cannot have children references modified without consequence to
the originating object.