match: Add interfaces{Added,Removed}AtPath()

The signature of the InterfacesAdded and InterfacesRemoved signals is
as follows[1]:

```
org.freedesktop.DBus.ObjectManager.InterfacesAdded (OBJPATH object_path,
                                                    ARRAY of DICT_ENTRY<STRING,ARRAY of DICT_ENTRY<STRING,VARIANT>> interfaces_and_properties);
org.freedesktop.DBus.ObjectManager.InterfacesRemoved (OBJPATH object_path,
                                                      ARRAY<STRING> interfaces);
```

The object path of interest forms the first argument of the signal's
message body, which is distinct the path specified in
the signal's message header. However, the implementation of
sdbusplus::bus::match::rules::interfaces{Added,Removed}() match on the
header's object path. In the case of these signals, the header path is
set to the path of the ObjectManager instance that emitted the signal.
This generally results in a failure to deliver signals expected by the
callers.

Add new functions `interfacesAddedAtPath()` and
`interfacesRemovedAtPath()` that provide matches that are constrained
with `argNpath(0, p)`. These align with the signal signature specified
above. Use of `argNpath()`` allows the caller to specify whether they
wish to match signals from a specific object or a subtree of objects.

Callers of interfacesAdded() providing a path will be migrated on a
case-by-case basis.

[1] https://dbus.freedesktop.org/doc/dbus-specification.html#standard-interfaces

Change-Id: Ie2f5125d45eb2dfe500d181016ccc968dd856b77
Signed-off-by: Andrew Jeffery <andrew@codeconstruct.com.au>
diff --git a/include/sdbusplus/bus/match.hpp b/include/sdbusplus/bus/match.hpp
index ec2c220..9a0c766 100644
--- a/include/sdbusplus/bus/match.hpp
+++ b/include/sdbusplus/bus/match.hpp
@@ -142,11 +142,21 @@
     return interfacesAdded().append(path(p));
 }
 
+constexpr auto interfacesAddedAtPath(std::string_view p) noexcept
+{
+    return interfacesAdded().append(argNpath(0, p));
+}
+
 constexpr auto interfacesRemoved(std::string_view p) noexcept
 {
     return interfacesRemoved().append(path(p));
 }
 
+constexpr auto interfacesRemovedAtPath(std::string_view p) noexcept
+{
+    return interfacesRemoved().append(argNpath(0, p));
+}
+
 inline auto propertiesChanged(std::string_view p, std::string_view i) noexcept
 {
     return type::signal()