CommandResult is now generic

CommandResult<T> returns T for getResponse.
The BsonDocument is still available in getRawResponse() and getResponse lazily decodes to T
CommandOperationHelper was refactored to take a decoder and reorganised to make it easier
to read / refactor in the future.

JAVA-1303