### Elasticsearch Version

8.2.0 (likely others)

### Installed Plugins

_No response_

### Java Version

_bundled_

### OS Version

Cloud

### Problem Description

I saw a NPE in `MlAssignmentNotifier#auditMlTasks` which looks to be due to the `PersistentTasksCustomMetadata` being completely missing (i.e. `null`) rather than simply empty.

### Steps to Reproduce

Unknown

### Logs (if relevant)

```
[instance-0000000000] uncaught exception in thread [elasticsearch[instance-0000000000][generic][T#5]]
java.lang.NullPointerException: Cannot invoke "org.elasticsearch.persistent.PersistentTasksCustomMetadata.tasks()" because "currentTasks" is null
	at org.elasticsearch.xpack.ml.MlAssignmentNotifier.auditMlTasks(MlAssignmentNotifier.java:96) ~[?:?]
	at org.elasticsearch.xpack.ml.MlAssignmentNotifier.auditChangesToMlTasks(MlAssignmentNotifier.java:76) ~[?:?]
	at org.elasticsearch.xpack.ml.MlAssignmentNotifier.lambda$clusterChanged$0(MlAssignmentNotifier.java:64) ~[?:?]
	at org.elasticsearch.common.util.concurrent.ThreadContext$ContextPreservingRunnable.run(ThreadContext.java:714) ~[elasticsearch-8.2.0.jar:8.2.0]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) ~[?:?]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) ~[?:?]
	at java.lang.Thread.run(Thread.java:833) [?:?]
```
x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/MlAssignmentNotifier.java
String id = ((StartDataFrameAnalyticsAction.TaskParams) currentTask.getParams()).getId();
                if (isTaskAssigned) {
                    String nodeName = nodeName(currentNodes, currentAssignment.getExecutorNode());
                    dataFrameAnalyticsAuditor.info(id, "Starting analytics on node [" + nodeName + "]");
                } else if (alwaysAuditUnassigned) {
                    dataFrameAnalyticsAuditor.warning(
                        id,
                        "No node found to start analytics. Reasons [" + currentAssignment.getExplanation() + "]"
                    );
                } else if (wasTaskAssigned) {
                    String nodeName = nodeName(previousNodes, previousAssignment.getExecutorNode());
                    anomalyDetectionAuditor.info(id, "Analytics unassigned from node [" + nodeName + "]");
                }
            }
        }
    }
    static String nodeName(DiscoveryNodes nodes, String nodeId) {
        
        
        
        
        
        DiscoveryNode node = nodes.get(nodeId);
        if (node != null && Strings.hasLength(node.getName())) {
            return node.getName();
        }
        return nodeId;
    }
}