multiple improvements and fixes

1. fallback to hybrid sync/async profiling

the full asynchronous profiling introduced in 0.3.5-2 may fail to update
the resource usage of some very short tasks and leave some statistics zero.
the hybrid profiling makes sure to update stat before dispatching events.

2. prevent program overrun in trace_kill()

certain linux kernels may leave a SIGKILLed program to overrun for a few
instructions; and the overrun may lead to undesirable side effects or even
security risk. the improved trace_kill() performs opcode flush and syscall
replacement to eliminate risky side effects.

3. refactor unittest framework to verify the fixes

the python unittest framework has been thoroughly refactored. new test cases
are included for verification and benchmarking.