Since all the type traits up until now have had Boolean vaules, we've
always been able to assume that the expressions are bool. This is
about to change (D151952 introduces a trait that returns size_t), so
we need to restructure the code so it doesn't become unwieldy.
This is achieved by giving traits a designated "return" type.