function _checkDone() {
      if (--remaining <= 0) {
        if (error) {
          reject(error);
        } else {
          resolve(obj);
        }
      }
    }
Casts and validates the given object against this model's schema, passing the
given `context` to custom validators.

#### Example:

    const Model = mongoose.model('Test', Schema({
      name: { type: String, required: true },
      age: { type: Number, required: true }
    });

    try {
      await Model.validate({ name: null }, ['name'])
    } catch (err) {
      err instanceof mongoose.Error.ValidationError; // true
      Object.keys(err.errors); // ['name']
    }

@param {Object} obj
@param {Object|Array|String} pathsOrOptions
@param {Object} [context]
@return {Promise<Object>} casted and validated copy of `obj` if validation succeeded
@api public