Finalise function apply scheme; add unit tests, inline all functions and hide all the types (as these are lightweight convenience functions to unify functors, function pointers and member function pointers)