mgmt: redesign ControlCommand and its usage in nfd::Controller

Split parameter encoding and validation into a separate class so that
different commands can have different formats in the future. Moreover,
request parameters and response parameters may be of different types.

Lastly, change the hierarchy to CRTP and make everything static. All the
encoding and validation details are the same for every request/response
of a given command type, so it makes no sense to allocate a separate
ControlCommand instance for each individual request.

Change-Id: I56c16dc3e275aaa48608478aad002d448c0492cc
diff --git a/tests/unit/util/dummy-client-face.t.cpp b/tests/unit/util/dummy-client-face.t.cpp
index a946858..8f40f4c 100644
--- a/tests/unit/util/dummy-client-face.t.cpp
+++ b/tests/unit/util/dummy-client-face.t.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2013-2024 Regents of the University of California.
+ * Copyright (c) 2013-2025 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -20,6 +20,7 @@
  */
 
 #include "ndn-cxx/util/dummy-client-face.hpp"
+#include "ndn-cxx/mgmt/nfd/control-command.hpp"
 #include "ndn-cxx/mgmt/nfd/controller.hpp"
 
 #include "tests/test-common.hpp"