### Elasticsearch Version

8.2.0

### Installed Plugins

_No response_

### Java Version

_bundled_

### OS Version

Cloud

### Problem Description

Creating a PIT without the required `?keep_alive` parameter throws a NPE which maps to HTTP status code `500 Internal Server Error` whereas really this isn't a server-side error, it's a bad request, so the status code should be something like `400 Bad Request`

### Steps to Reproduce

```
# Request:
POST /_pit

# Response:
# 500 Internal Server Error
# {
#   "status": 500,
#   "error": {
#     "reason": "[keep_alive] parameter must be non null",
#     "root_cause": [
#       {
#         "reason": "[keep_alive] parameter must be non null",
#         "type": "null_pointer_exception"
#       }
#     ],
#     "type": "null_pointer_exception"
#   }
# }
```

### Logs (if relevant)

_No response_
server/src/main/java/org/elasticsearch/action/search/OpenPointInTimeRequest.java
}
    public OpenPointInTimeRequest routing(String routing) {
        this.routing = routing;
        return this;
    }
    public String preference() {
        return preference;
    }
    public OpenPointInTimeRequest preference(String preference) {
        this.preference = preference;
        return this;
    }
    @Override
    public boolean allowsRemoteIndices() {
        return true;
    }
    @Override
    public boolean includeDataStreams() {
        return true;
    }
    @Override
    public String getDescription() {
        return "open search context: indices [" + String.join(",", indices) + "] keep_alive [" + keepAlive + "]";
    }
    @Override
    public Task createTask(long id, String type, String action, TaskId parentTaskId, Map<String, String> headers) {
        return new SearchTask(id, type, action, this::getDescription, parentTaskId, headers);
    }
}