Test assignment operators correctly.

Previously we did something like this:

    TypeParam param = this->initialValue;

This does not actually call the copy assignment operator but calls
the copy constructor and skips assignment. In order to call the
copy assignment operator we must first construct the object
like this:

    TypeParam param;
    param = this->initialValue;

Additionally, there is a safer way to test for crashes when checking
for undefined behaviour. That is to use EXPECT_EXIT, with a zero exit
code at the end of the test block to ensure that everything succeeded.