Code reoganization in order to reduce casting and manual typechecking

@ikeough 

Unfortunately merging with master has obfuscated the actual set of changes I've made. You should review the actual commits instead: 

* 0af81e6d1bc16e56e78a6ba7b0ca3fe00bddc18a
* ad5a2bec6e13630d4cba10838812683b3ed2bba0

Semantically, the only real difference is what we had discussed around the Selection lists: The list of raw selection (of type `TSelection`) is kept internal to the selection classes (but we expose a public `IEnumerable<TSelection>` instance for querying). All output from the node is kept in the `SelectionResult` list (also only exposed publically as an `IEnumerable<TResult>`). Selection is set via the `UpdateSelection` method.