Moved responsibility of cleaning up test context

By letting TestContext having the responsibility of cleaning itself up, it
becomes easier to test in isolation.
Dispose overwritten IDisposable instances

If an IDisposable object in the context was replaced, it would no longer be
disposed after teardown. This is not fixed. Subjects are also disposed