More unit tests

- Wrote more unit tests & caught some nasty bugs in the process
- Added :timeout keyword param to `wait-on-semaphore'
- Added `semaphore-waiters' reader method
- Restored method documentation