Add a way to run custom cluster logic for attribute reads (#9667)

* Add machinery to allow a cluster implementation to intercept attribute reads.

This allows a cluster implementation to provide custom logic for an
attribute read without requiring the attribute to be marked external
and needing to trampoline through the app callback.

* Add a no-op attribute access override to the Ethernet Network Diagnostics cluster.

This just adds the class and registration machinery for it.  It does
not produce any data yet.

The build system changes are for various example apps that enabled the
diagnostics clusters in their ZAP configuration but did not actually
compile in the code for them.  Those stop linking with this change,
since they don't include the cluster init function.

* Stop using the external attribute callback in lighting-app.

Instead handle ethernet network diagnostics via an attribute override.

* Disallow registering conflicting attribute access overrides.
diff --git a/zzz_generated/bridge-app/zap-generated/endpoint_config.h b/zzz_generated/bridge-app/zap-generated/endpoint_config.h
index bc23370..b04fa56 100644
--- a/zzz_generated/bridge-app/zap-generated/endpoint_config.h
+++ b/zzz_generated/bridge-app/zap-generated/endpoint_config.h
@@ -987,6 +987,9 @@
     const EmberAfGenericClusterFunction chipFuncArrayBasicServer[] = {                                                             \
         (EmberAfGenericClusterFunction) emberAfBasicClusterServerInitCallback,                                                     \
     };                                                                                                                             \
+    const EmberAfGenericClusterFunction chipFuncArrayEthernetNetworkDiagnosticsServer[] = {                                        \
+        (EmberAfGenericClusterFunction) emberAfEthernetNetworkDiagnosticsClusterServerInitCallback,                                \
+    };                                                                                                                             \
     const EmberAfGenericClusterFunction chipFuncArrayOnOffServer[] = {                                                             \
         (EmberAfGenericClusterFunction) emberAfOnOffClusterServerInitCallback,                                                     \
     };                                                                                                                             \
@@ -1028,9 +1031,12 @@
             {                                                                                                                      \
                 0x0036, ZAP_ATTRIBUTE_INDEX(87), 6, 14, ZAP_CLUSTER_MASK(SERVER), NULL                                             \
             }, /* Endpoint: 0, Cluster: WiFi Network Diagnostics (server) */                                                       \
-            {                                                                                                                      \
-                0x0037, ZAP_ATTRIBUTE_INDEX(93), 6, 42, ZAP_CLUSTER_MASK(SERVER), NULL                                             \
-            }, /* Endpoint: 0, Cluster: Ethernet Network Diagnostics (server) */                                                   \
+            { 0x0037,                                                                                                              \
+              ZAP_ATTRIBUTE_INDEX(93),                                                                                             \
+              6,                                                                                                                   \
+              42,                                                                                                                  \
+              ZAP_CLUSTER_MASK(SERVER) | ZAP_CLUSTER_MASK(INIT_FUNCTION),                                                          \
+              chipFuncArrayEthernetNetworkDiagnosticsServer }, /* Endpoint: 0, Cluster: Ethernet Network Diagnostics (server) */   \
             {                                                                                                                      \
                 0x003C, ZAP_ATTRIBUTE_INDEX(99), 1, 2, ZAP_CLUSTER_MASK(SERVER), NULL                                              \
             }, /* Endpoint: 0, Cluster: AdministratorCommissioning (server) */                                                     \