Abstract class to simplify defining datasets. This handles the properties for implementations, and they need only implement rank, and override the corresponding value and length methods.