code: function createCopyDescriptors(obj, deep, template) {
    const pdc = {};
    const _tpl = template || { enumerable: true };
    Object.keys(obj).forEach(key => {
      const val = obj[key];
      const valueDesc = { value: { value:  deep ? deepCopy(val, _tpl) : val } };
      pdc[key] = Object.create(_tpl, valueDesc);
    });
    return pdc;
  }
docs: Creates a dictionary of property descriptors that can be used as the second
  argument to {@link Object.defineProperties}. It does this by enumerating
  the own properties of `obj` using {@link Object.keys} and then constructing
  an object with corresponding keys and property descriptors as values of those
  keys. The property descriptor is created using `template` as starting point, to
  which it adds a `value` property. This method can also make deep copies of
  `obj` by passing in a truthy `deep` value. This method doesn't type check `obj`.
  @param {Object} object - the object to create copy descriptors for
  @param {boolean} [deep] - controls whether the `value` property of the property
  @param {Object} [template] - a property descriptor template, to which `value` is added
  descriptor should be populated with a deeply-copied value from the source object.
  @return {Object} that contains property descriptors to use in {@link Object.create}