function overrideAll(attrs, editTypeOverride, overrideContainers) {
    var out = extendFlat({}, attrs);
    for(var key in out) {
        var attr = out[key];
        if(isPlainObject(attr)) {
            out[key] = overrideOne(attr, editTypeOverride, overrideContainers, key);
        }
    }
    if(overrideContainers === 'from-root') out.editType = editTypeOverride;

    return out;
}
For attributes that are largely copied from elsewhere into a plot type that doesn't
support partial redraws - overrides the editType field of all attributes in the object

@param {object} attrs: the attributes to override. Will not be mutated.
@param {string} editTypeOverride: the new editType to use
@param {'nested'|'from-root'} overrideContainers:
  - 'nested' will override editType for nested containers but not the root.
  - 'from-root' will also override editType of the root container.
  Containers below the absolute top level (trace or layout root) DO need an
  editType even if they are not `valObject`s themselves (eg `scatter.marker`)
  to handle the case where you edit the whole container.

@return {object} a new attributes object with `editType` modified as directed