- In BioC 3.18: migrate from SparseArraySeed objects to SparseArray objects
  for handling of sparse data. 7 steps:
  1. The new location for the extract_sparse_array() generic is in the
     SparseArray package. However SparseArray::extract_sparse_array()
     behaves differently compared to the traditional extract_sparse_array()
     generic defined in DelayedArray (it returns a SparseArray object instead
     of a SparseArraySeed object). So, before we can import the SparseArray
     package, we must rename the extract_sparse_array() generic and methods
     defined in DelayedArray and its revdeps to extract_sparse_array_OLD().
  2. Depend and import SparseArray.
  3. Get rid of R/sparseMatrix-utils.R and src/sparseMatrix_utils.c (this is
     now in SparseArray).
  4. Prepare for the switch from .read_block_OLD() to .read_block_NEW() (see
     S4Arrays/R/read_block.R) by implementing:
       (a) SparseArray::extract_sparse_array() methods: one for each
           extract_sparse_array_OLD() method defined in DelayedArray
           and its revdeps;
       (b) SparseArray::read_block_as_sparse() methods: one for each
           read_sparse_block() method defined in DelayedArray and its revdeps.
  5. Switch from .read_block_OLD() to .read_block_NEW() in S4Arrays.
  6. Then, extract_sparse_array_OLD() and read_sparse_block() can be
     deprecated.
  7. Finally, SparseArraySeed objects can be deprecated.

- Backend classes (e.g. HDF5Array) should be defined as:
    setClass("HDF5Array",
        contains="DelayedArray",
        representation(seed="HDF5ArraySeed")
    )
  This would avoid the need for a validity method.
  This change was made for RleArray, HDF5Array and TENxMatrix between Dec 2018
  and Jan 2019.
  Still need to be done for DelayedArray backends implemented in other
  packages.

- In 02-Implementing_a_backend.Rmd, add a "Other optional (but highly
  recommended) methods" subsection after "The seed contract" subsection.
  The optional methods are "chunkdim", "path", "path<-". See HDF5ArraySeed
  and TENxMatrixSeed for examples.

- Subsetting:

  - A[A == 1] should work on a 1D DelayedArray object (and return a 1D
    DelayedArray object).

  - If A and B are conformable DelayedArray objects, and type(B) is logical,
    it should be possible to compute A[B] by walking simultaneously on A
    and B. Right now we first do i <- which(B) and then A[i] so we complete
    the walk on B before we walk on A.

  - Support subsetting an arbitrary object by a DelayedArray or
    DelayedMatrix of type logical?

- Add unit tests for all the DelayedOp types.

- Add man page and unit tests for statistical methods defined in
  DelayedArray-stats.R

- Make DelayedArray contain Annotated from S4Vectors?

- Add more examples to the man pages (using the toy dataset).

- Add unit tests for round() and signif() (Math2 group).

- Explore DelayedAtomicVector. Could be used in situations where
  1D DelayedArray objects are currently used (e.g. VariantExperiment
  package). Then reconsider what subsetting does when 'drop' is TRUE.
  Should it return the result as an ordinary vector instead of a 1D
  DelayedArray object? We're not doing this right now because it would
  be inconvenient for people using 1D DelayedArray objects (it triggers
  realization when the user probably doesn't want it). But if people
  switch to DelayedAtomicVector objects then maybe it's ok to make this
  change.

- Support more matrix- and array-like operations.

- How well supported are DelayedArray of type "character"?

- Add more unit tests.


