Implements operational semantics for new operators.

The PSynchronisingExternalChoice and PSynchronisingInterrupt operators
have been added.
Caches events in a hash table

Many Event objects were being kept around on the C++ side, wasting
memory. This was due to the haskell functions always returning a
different StablePtr to the same event. Now Haskell keeps a mapping of
events to the pointers it has shared with C++, meaning that it always
returns the same pointer for the same event, thus C++ only needs to
store a number of events at most equal to the number of distinct events.

To do this, the input/output functions have been made monadic to allow
access to the hash table. Therefore, most of the exported functions now
require the session pointer to be passed.
Adds support for closing and reloading sessions.

Also removes a pointless bit of guff from the test CSP file.