Create arrfunc from function pointer or functor

This PR uses a combination of template and preprocessor metaprogramming to facilitate creation of nd::arrfunc objects from C++ function pointers and functors. For example:

```cpp
double myfunc(int x, float y)
{
  return x + 2.5 * y;
}

int main()
{
  nd::arrfunc af = nd::make_functor_arrfunc(myfunc);
  cout << af(3, 1.1f) << endl;
}
```