text: Title: Good First Issue [Deep Learning]: Add Support for Custom Loss Functions in `create_and_compile` Function
  Body: ### Issue Description:
  
  Currently, the `create_and_compile` (ForecasterRNN) function allows specifying predefined loss functions via the `loss` argument, but there is no support for passing custom loss functions directly. To enhance the flexibility of model compilation, the function should be updated to allow users to pass custom loss functions to the `create_and_compile` function.
  
  ### Feature Request:
  
  Modify the `create_and_compile` function to accept custom loss functions. This should be done by allowing a callable loss function to be passed as the `loss` argument. The function should validate whether the loss function is either a string (for predefined losses) or a callable (for custom losses).
  
  ### Acceptance Criteria:
  - [ ] Update the `create_and_compile` function to accept a custom loss function (a callable) in addition to predefined loss strings.
  - [ ] Ensure proper validation for the `loss` argument:
  - [ ] Maintain the current logic that handles passing compile arguments (`compile_kwargs`), but ensure that custom loss functions are prioritized when passed.
  - [ ] Add unit tests to validate that the `create_and_compile` function can handle both predefined loss strings and custom loss functions.
  - [ ] Update the documentation and docstrings to describe the new behavior for custom loss functions.
  
  ### Example:
  
  ```python
  # Define a custom loss function
  def custom_loss_function(y_true, y_pred):
      return tf.reduce_mean(tf.square(y_true - y_pred))
  
  # Pass the custom loss function to `create_and_compile`
  model = create_and_compile(
      lags=10, 
      n_series=5, 
      recurrent_units=[32, 64], 
      dense_units=[64], 
      optimizer="adam", 
      loss=custom_loss_function,  # Custom loss function passed here
      compile_kwargs={}
  )
  ```
  
  ### Notes:
  - Ensure that the custom loss function signature matches the expected format (`y_true`, `y_pred`).
  - When a custom loss function is passed, it should override any predefined loss functions.
  - Ensure that when a custom loss function is provided, it is correctly handled in conjunction with `compile_kwargs`.
  
  This enhancement will allow users to leverage specialized loss functions, further extending the flexibility and utility of the model creation and compilation process.