Rewrite tests

For various reasons, I am rewriting all the tests.

The previous design used regex matching on the whole event message, which was unreliable and made edge matching very awkward. It has now been rewritten to properly deserialize the event messages and inspect them in greater depth.

I have also isolated all the instrumentation test actions from validation so we can run the action code of any test as a free-standing app. This makes things like performance testing a lot easier.