major improvements to cancellation handling

- there is no longer any risk of spoofing cancellation requests, since
  the cancel flag is set in pthread_cancel rather than in the signal
  handler.

- cancellation signal is no longer unblocked when running the
  cancellation handlers. instead, pthread_create will cause any new
  threads created from a cancellation handler to unblock their own
  cancellation signal.

- various tweaks in preparation for POSIX timer support.
diff --git a/src/internal/pthread_impl.h b/src/internal/pthread_impl.h
index 615b963..f2d0ae8 100644
--- a/src/internal/pthread_impl.h
+++ b/src/internal/pthread_impl.h
@@ -41,10 +41,14 @@
 		long off;
 		void *pending;
 	} robust_list;
+	int unblock_cancel;
 };
 
 struct __timer {
-	struct sigevent sev;
+	int timerid;
+	union sigval val;
+	void (*notify)(union sigval);
+	pthread_t thread;
 };
 
 #define __SU (sizeof(size_t)/sizeof(int))
@@ -73,7 +77,6 @@
 
 #define SIGCANCEL 32
 #define SIGSYSCALL 33
-#define SIGTIMER  32 /* ?? */
 
 int __set_thread_area(void *);
 int __libc_sigaction(int, const struct sigaction *, struct sigaction *);