Recursively merge various objects into a single new object, optionally capable of reflecting changes on the merged object