General curried function base class.

Implement `make_curried_n<N,F>` where `F` is a type derived from
`make_curried_n` and `N` is its arity. `make_curried_n` relies on a new
overload of `curry`, `curry<N>(f)`, which returns a new type,
`_dtl::curried_fn_n<N,F>`. 

Add tests to `tests/prelude_tests.cpp` to ensure that both the new `curry`
overload and `make_curried_n` work.