apply (target, opts) {
    opts || (opts = {})
    opts.getter || (opts.getter = '_get')
    opts.setter || (opts.setter = '_set')
    opts.unsetter || (opts.unsetter = '_unset')
    opts.track || (opts.track = this.track)
    const properties = this.properties || {}
    utils.forOwn(properties, (schema, prop) => {
      Object.defineProperty(
        target,
        prop,
        this.makeDescriptor(prop, schema, opts)
      )
    })
  }
This adds ES5 getters/setters to the target based on the "properties" in
this Schema, which makes possible change tracking and validation on
property assignment.

@name Schema#apply
@method
@param {object} target The prototype to which to apply this schema.