Fix the BulkEnrollSerializer courses field to internally behave with strings and lists

Description

Follow up to https://github.com/edx/edx-platform/pull/15006: Internally, DRF may pass data into the value conversion method of ListFields `to_internal_value` as a list instead of a string in some cases, so `StringListField` in the Bulk Enroll API needs to work with both. This change adds this support and tests.

*Sandbox URL:* Sandbox URL: https://pr15579.sandbox.opencraft.hosting/ (provisioning)

*Test setup instructions:*
1. [Add a new OAuth2 client](http://localhost:8000/admin/oauth2/client/add/):
1. For the "User", set it to the `staff` user (likely the user ID is 5 if on a devstack)
1. For the "Url", set it to anything: `http://example.com/`
1. For the "Redirect uri", set it to anything: `http://example.com/callback`
1. Copy the "Client id" and "Client secret" for use when constructing requests
1. For "Client type", select "Confidential (Web applications)"
1. Click "Save"

*Testing instructions:*
Replace the "client_id" and "client_secret" with the respective keys copied suring the test setup instructions, and run the following to obtain an access token:
```terminal

  1. Get a token:
    curl -X POST -d "client_id=6f663d9f3425fade127c&client_secret=8a3a91e83f61fd54e9f7c074acfed909cbcc196e&grant_type=client_credentials&token_type=bearer" http://localhost:8000/oauth2/access_token/

  1. Example Response:
    {"access_token": "773b8ef9fb8747e62360b0215f133c2793ed267a", "id_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmYW1pbHlfbmFtZSI6IkFkYW1hIiwiYWRtaW5pc3RyYXRvciI6dHJ1ZSwic3ViIjoiNjZjNmQxNzE4MTZlZjgxZGM4ODg1OWYwZTg3YWU3MzIiLCJpc3MiOiJodHRwOi8vMTI3LjAuMC4xOjgwMDAvb2F1dGgyIiwidXNlcl90cmFja2luZ19pZCI6NSwicHJlZmVycmVkX3VzZXJuYW1lIjoic3RhZmYiLCJuYW1lIjoic3RhZmYiLCJsb2NhbGUiOiJlbiIsImdpdmVuX25hbWUiOiJCaWxsIiwiZXhwIjoxNTAwMDczNDQwLCJpYXQiOjE1MDAwNjk4NDAsImVtYWlsIjoic3RhZmZAZXhhbXBsZS5jb20iLCJhdWQiOiI2ZjY2M2Q5ZjM0MjVmYWRlMTI3YyJ9.xO187GzdbvFqDuju_URXWewX7Dn-foQH60srrR1jHa0", "expires_in": 31535999, "token_type": "Bearer", "scope": "profile openid email permissions"}
    ```

Using the access token in the response from the previous step, construct an authenticated request to the bulk_enroll endpoint (replace "course-v1:asdf+asdf+asdf" with a course on your devstack):
```terminal

  1. Post the enrollment:
    curl -X POST --header "Authorization: Bearer 773b8ef9fb8747e62360b0215f133c2793ed267a" -H "Content-Type: application/json" -d '{"action": "enroll","auto_enroll": true,"email_students": true,"courses": "course-v1:asdf+asdf+asdf","identifiers": "staff@example.com"}' http://localhost:8000/api/bulk_enroll/v1/bulk_enroll

  1. Example Response:
    {"action":"enroll","courses":{"course-v1:asdf+asdf+asdf":{"action":"enroll","results":[{"identifier":"staff@example.com","after":{"enrollment":true,"allowed":false,"user":true,"auto_enroll":false},"before":{"enrollment":true,"allowed":false,"user":true,"auto_enroll":false}}],"auto_enroll":true}},"email_students":true,"auto_enroll":true}
    ```

*Settings*
```yaml
EDXAPP_FEATURES:
ENABLE_COMBINED_LOGIN_REGISTRATION: true
ENABLE_BULK_ENROLLMENT_VIEW: true

Done

Assignee

Unassigned

Reporter

Open Source Pull Request Bot

Contributor Name

Brandon DeRosier

Repo

edx/edx-platform

Customer

Epic Link

None

OSCM Assignee

None

Platform Map Area (Levels 1 & 2)

None

Platform Map Area (Levels 3 & 4)

None

Blended Hour Utilization Percentage

None

edX Theme

None

edX Squad

None

Github Lines Added

None

Github Lines Deleted

None

Priority

Unset