ES6 Object.assign() like functionality, but does not replace existing properties, and is recursive.