This is done by generating the supporting preprocessor macros with ERB up to
the required arity, like we do for the struct macros themselves.
Fixes#376
This is done because the resulting macros are much more straightforward
to debug when a user makes a mistake. Also, it avoids pulling yet another
dependency.
Also added some general purpose macros in detail/preprocessor.hpp.