Use n-ary sums and products for NDP's generic representation
Originally, we wanted to only use binary ones, at least initially. But this
would a lot of fiddling with selectors when converting to/from generic
array representations. This is both inefficient and hard to implement.
Instead, we will limit the arity of our sums/product representation to, say,
16 (it's 3 at the moment) and initially refuse to vectorise programs for which
this is not sufficient. This allows us to implement everything in the library.
Later, we can implement the necessary splitting.