A vector-derived datatype follows a regular pattern but, at the same time, allows
for "holes" via a stride. The stride normally exceeds the block length.
An indexed-derived datatype relies on arrays to hold element lengths and displacements,
permitting holes that are arbitrary in location and size.
A struct-derived datatype consists of elements that may be of different basic
datatypes; therefore, displacements must be given in bytes.