sdbus++: generate `properties` method for client harness

This uses the existing proxy `get_all_properties` method and allows for
more efficient fetching of all properties in one shot. A struct is
generated for each type, and each field is initialized with its default
value (but is not guaranteed to be deserialized).

As errors are less detectable (e.g. perhaps an expected property
did not come through?), I considered whether the values in the struct
should all be `std::optional`. However, given how other methods are
used, it feels like this would result in a crash and assertion
failure rather than saving anyone time and effort. The wrong type
is detected a suitable exception is thrown in those cases.

Change-Id: Iff7712bd17db39f1ee5699f867e9f17a54eea21b
Signed-off-by: Adin Scannell <adin@scannell.ca>
diff --git a/example/calculator-client.cpp b/example/calculator-client.cpp
index 0c9b3ad..5e3a40e 100644
--- a/example/calculator-client.cpp
+++ b/example/calculator-client.cpp
@@ -59,6 +59,13 @@
         std::cout << "Should be 'client': " << _ << std::endl;
     }
 
+    {
+        // Grab all the properties and print them.
+        auto _ = co_await c.properties();
+        std::cout << "Should be 1234: " << _.last_result << std::endl;
+        std::cout << "Should be 'client': " << _.owner << std::endl;
+    }
+
     co_return;
 }