Improve scalability of P4Runtime subsystem

The P4Runtime client was hanging (deadlock) on a master arbitration
request. As such, all other requests (e.g. table write) were waiting
for the client's request lock to become available.

Apart from fixing those deadlocks, this patch brings a number of
improvements that all together allow to run networks of 100+ P4Runtime
devices on a single ONOS instance (before only ~20 devices)

Includes:
- Asynchrounous mastership handling in DevicHandshaker (as defined in
the P4Runtime and OpenFlow spec)
- Refactored arbitration handling in the P4RuntimeClient
to be consistent with the P4Runtime spec
- Report suspect deadlocks in P4RuntimeClientImpl
- Exploit write errors in P4RuntimeClient to quickly report
channel/mastership errors to upper layers
- Complete all futures with deadlines in P4Runtime driver
- Dump all tables in one request
- Re-purposed ChannelEvent to DeviceAgentEvent to carry also mastership
response events
- Fixed IntelliJ warnings
- Various code and log clean-ups

Change-Id: I9376793a9fe69d8eddf7e8ac2ef0ee4c14fbd198
diff --git a/core/api/src/main/java/org/onosproject/net/device/DeviceHandshaker.java b/core/api/src/main/java/org/onosproject/net/device/DeviceHandshaker.java
index 606248a..bc870d3 100644
--- a/core/api/src/main/java/org/onosproject/net/device/DeviceHandshaker.java
+++ b/core/api/src/main/java/org/onosproject/net/device/DeviceHandshaker.java
@@ -30,38 +30,41 @@
 public interface DeviceHandshaker extends DeviceConnect {
 
     /**
-     * Checks the reachability (connectivity) of a device.
-     * Reachability, unlike availability, denotes whether THIS particular node
-     * can send messages and receive replies from the specified device.
+     * Checks the reachability (connectivity) of a device. Reachability, unlike
+     * availability, denotes whether THIS particular node can send messages and
+     * receive replies from the specified device.
      *
      * @return CompletableFuture eventually true if reachable, false otherwise
      */
     CompletableFuture<Boolean> isReachable();
 
     /**
-     * Applies on the device a mastership role change as decided by the core.
+     * Notifies the device a mastership role change as decided by the core. The
+     * implementation of this method should trigger a {@link DeviceAgentEvent}
+     * signaling the mastership role accepted by the device.
      *
-     * @param newRole newly determined mastership role
-     * @return CompletableFuture with the mastership role accepted from the device
+     * @param newRole new mastership role
      */
-    CompletableFuture<MastershipRole> roleChanged(MastershipRole newRole);
+    void roleChanged(MastershipRole newRole);
 
     /**
-     * Applies a listener to a channel established with the device.
+     * Adds a device agent listener.
      *
-     * @param listener the channel listener
+     * @param listener device agent listener
      */
-    default void addChannelListener(ChannelListener listener) {
-        throw new UnsupportedOperationException("Listener Registration not supported");
+    default void addDeviceAgentListener(DeviceAgentListener listener) {
+        throw new UnsupportedOperationException(
+                "Device agent listener registration not supported");
     }
 
     /**
-     * Removes a listener to a channel established with the device.
+     * Removes a device agent listener.
      *
-     * @param listener the channel listener
+     * @param listener device agent listener
      */
-    default void removeChannelListener(ChannelListener listener) {
-        throw new UnsupportedOperationException("Listener Removal not supported");
+    default void removeDeviceAgentListener(DeviceAgentListener listener) {
+        throw new UnsupportedOperationException(
+                "Device agent listener removal not supported");
     }
 
 }