include/types_fmt: use fmt::join() to format containers
* add formatter for classes with stream insertion operator.
as in fmtlib v6.1.2, which is the one shipped with ubuntu focal,
fmt::join() requires the printed element to have formatter.
see https://github.com/fmtlib/fmt/issues/2040 and
https://github.com/fmtlib/fmt/issues/1462
* use template parameter pack to represent container template argument,
simpler this way. also, this enables us to print specialized
classes which uses non-default template parameters.
* use fmt::join() to print container elements. see also
https://fmt.dev/latest/api.html#_CPPv4I0EN3fmt4joinE9join_viewIN6detail10iterator_tI5RangeEEN6detail10sentinel_tI5RangeEEERR5Range11string_view