instead of these two traits and a val shardReaderCompanion, why not use a 'def oneShardReader(....) : Iterator[NodeIdEdgesMaxId]"  that is then implemented in the implementing classes?