Cascade dispose calls to all member variables

To ensure that everything gets disposed of so we reduce the chance of
memory leaks, all dispose methods now call dispose on any disposable
member variables.