### Description

From the nodes stats API, we should extract the `thread_pool` stats into their own endpoint. This endpoint can then be non-node-centric, and present a global view of the number of completed, rejected, and failed operations for each of the threadpools in the system.
server/src/test/java/org/elasticsearch/action/admin/cluster/node/stats/NodeStatsTests.java
randomNonNegativeLong(),
                randomNonNegativeLong(),
                randomNonNegativeLong(),
                randomNonNegativeLong(),
                randomNonNegativeLong(),
                IntStream.range(0, HandlingTimeTracker.BUCKET_COUNT).mapToLong(i -> randomNonNegativeLong()).toArray(),
                IntStream.range(0, HandlingTimeTracker.BUCKET_COUNT).mapToLong(i -> randomNonNegativeLong()).toArray(),
                Map.of("test-action", new TransportActionStats(1, 2, new long[29], 3, 4, new long[29]))
            )
            : null;
        HttpStats httpStats = null;
        if (frequently()) {
            int numClients = randomIntBetween(0, 50);
            List<HttpStats.ClientStats> clientStats = new ArrayList<>(numClients);
            for (int k = 0; k < numClients; k++) {
                var cs = new HttpStats.ClientStats(
                    randomInt(),
                    randomAlphaOfLength(6),
                    randomAlphaOfLength(6),
                    randomAlphaOfLength(6),
                    randomAlphaOfLength(6),
                    randomAlphaOfLength(6),
                    randomAlphaOfLength(6),
                    randomNonNegativeLong(),
                    randomBoolean() ? -1 : randomNonNegativeLong(),
                    randomBoolean() ? -1 : randomNonNegativeLong(),
                    randomLongBetween(0, 100),
                    randomLongBetween(0, 99999999)
                );
                clientStats.add(cs);