posix: Use cleanup contexts on the stack

Provide support for latest Newlib <pthread.h> change.  The cleanup
contexts are stored on the thread stack.  This is conformant with the
POSIX requirements for the pthread_cleanup_push() and
pthread_cleanup_pop() statement pair.

Passing an invalid pointer as the routine to pthread_cleanup_push() is
now a usage error and the behaviour is undefined.