docs: def validate_config(config, required_keys, optional_keys=None):
    """ Validate a config dictionary to make sure it includes all required keys
        and does not include any unexpected keys.
  
    Args:
      config: the config to validate.
      required_keys: the names of the keys that the config must have.
      optional_keys: the names of the keys that the config can have.
  
    Raises:
      Exception if the config is not a dict or invalid.
    """
    if optional_keys is None:
      optional_keys = []
    if not isinstance(config, dict):
      raise Exception('config is not dict type')
    invalid_keys = set(config) - set(required_keys + optional_keys)
    if len(invalid_keys) > 0:
      raise Exception('Invalid config with unexpected keys "%s"' % ', '.join(e for e in invalid_keys))
    missing_keys = set(required_keys) - set(config)
    if len(missing_keys) > 0:
      raise Exception('Invalid config with missing keys "%s"' % ', '.join(missing_keys))