Add Thread::join()

A new Event subclass takes the role of an internal synchronization
primitive between threads, SyncEvent. This class has two subclasses that
model the sending and receiving of a bit over a unique memory address.

Changes:

* Add internal SyncEvent class with SendEvent and ReceiveEvent subclasses
* Add Threads::join(const std::shared_ptr<SendEvent>&) static function
* Change return type of Threads::end_thread(Z3&) to SendEvent pointer
Add Mutex class

The Mutex class symbolically encodes the semantics of a spinlock.
Unlike CBMC's built-in pthread library, our symbolic encoding
explicitly identifies the thread that is in the critical region.
Add benchmark that uses Mutex and Thread::join()