Deep merging of objects with the same function signature as Object.assign() (useful for overriding default options objects)