text: Title: Add support for the `args=()` argument to the *_minimize API
  Body: Hi, maybe I'm doing this wrong, but I was trying to implement a version of what's in the hyperparameter optimization example, but not in an interactive notebook.  If I set up the training data and search space in main() or another function, the only way for the objective function that I pass to the minimizer to access those variables is if I make them global.  Is that right?
  
  Would it make sense for there be another way to pass additional variables/kwargs to the objective function in the minimizer call?  But then I guess the minimizer might then have to return those objects, too, so maybe not.  
  
  Is there any way to avoid globals like I did below?
  
  ```
  def objective(params):
      max_depth, learning_rate, max_features, min_samples_split, min_samples_leaf = params
  
      reg.set_params(max_depth=max_depth,
                     learning_rate=learning_rate,
                     max_features=max_features,
                     min_samples_split=min_samples_split, 
                     min_samples_leaf=min_samples_leaf)
  
      return -np.mean(cross_val_score(reg, X_train, y_train, cv=5, n_jobs=-1,
                                      scoring="neg_mean_absolute_error"))
  ```
  
  ```
  def optimize_ml(X, y):
      global X_train
      global y_train
      global reg
  
      X_train, y_train, X_test, y_test = train_test_split(X, y, test_size=.25)
      reg = GradientBoostingRegressor(n_estimators=50, random_state=0)
  
      space  = [(1, 5),                           # max_depth
            (10**-5, 10**-1, "log-uniform"),  # learning_rate
            (1, X.shape[1]),                  # max_features
            (2, 30),                          # min_samples_split
            (1, 30)]                          # min_samples_leaf
  
      x0 = [3, 0.01, 6, 2, 1]
      res_gp = gp_minimize(objective, space, x0=x0, n_calls=50, random_state=0)
  ```
  