New P4RuntimeClient implementation that supports batching and error reporting

The new client API supports batching and provides detailed response for
write requests (e.g. if entity already exists when inserting), which was
not possible with the old one.

This patch includes:
- New more efficient implementation of P4RuntimeClient (no more locking,
use native gRPC executor, use stub deadlines)
- Ported all codecs to new AbstractCodec-based implementation (needed to
implement codec cache in the future)
- Uses batching in P4RuntimeFlowRuleProgrammable and
P4RuntimeGroupActionProgrammable
- Minor changes to PI framework runtime classes

Change-Id: I3fac42057bb4e1389d761006a32600c786598683
diff --git a/core/api/src/main/java/org/onosproject/net/pi/runtime/PiActionProfileGroupHandle.java b/core/api/src/main/java/org/onosproject/net/pi/runtime/PiActionProfileGroupHandle.java
index 519a1c4..3579054 100644
--- a/core/api/src/main/java/org/onosproject/net/pi/runtime/PiActionProfileGroupHandle.java
+++ b/core/api/src/main/java/org/onosproject/net/pi/runtime/PiActionProfileGroupHandle.java
@@ -27,7 +27,7 @@
  * defined by a device ID, action profile ID and group ID.
  */
 @Beta
-public final class PiActionProfileGroupHandle extends PiHandle<PiActionProfileGroup> {
+public final class PiActionProfileGroupHandle extends PiHandle {
 
     private final PiActionProfileId actionProfileId;
     private final PiActionProfileGroupId groupId;
@@ -39,10 +39,11 @@
     }
 
     /**
-     * Creates a new handle for the given device ID and PI action profile group.
+     * Creates a new handle for the given device ID and PI action profile
+     * group.
      *
      * @param deviceId device ID
-     * @param group PI action profile group
+     * @param group    PI action profile group
      * @return PI action profile group handle
      */
     public static PiActionProfileGroupHandle of(DeviceId deviceId,
@@ -50,6 +51,24 @@
         return new PiActionProfileGroupHandle(deviceId, group);
     }
 
+    /**
+     * Returns the action profile ID of this handle.
+     *
+     * @return action profile ID
+     */
+    public PiActionProfileId actionProfile() {
+        return actionProfileId;
+    }
+
+    /**
+     * Returns the group ID of this handle.
+     *
+     * @return group ID
+     */
+    public PiActionProfileGroupId groupId() {
+        return groupId;
+    }
+
     @Override
     public PiEntityType entityType() {
         return PiEntityType.ACTION_PROFILE_GROUP;