CallDescriptions have a RequiredArgs and RequiredParams members,
but they are of different types, unsigned and size_t respectively.
In the patch I use only unsigned for both, that should be large enough
anyway.
In the patch, I also avoid the use of the smart less-than operator.
template <typename T> constexpr bool operator<=(const Optional<T> &X, const T &Y);
Which would check if the optional has a value and compare the data
only after. I found it surprising, thus I think we are better off
without it.
What about using a common type alias for these two?