Internally, this uses the generic-array crate, which utilizes types from
typenum to specify the capacity at compile time, allowing the space for
the queue to be allocated inline. Thus, this channel also requires
specifying the capacity upfront at compile time.

This can be useful, for example, when implementing a server. One task can
handle each client, where the producer waits for incoming requests and
writes responses; and the consumer waits for requests, handles them, and
then generates a response.

Once the transmission endpoints have been acquired via split(), the
channel cannot be moved. This is required for safety, since each endpoint
contains a reference back to the channel; thus, if the channel were to move,
those references would become dangling.

Further, endpoints must remain anchored to a single thread, since access
to the underlying data structures is not thread-safe. Unfortunately, this
isn't enforced by the compiler, and scoped thread libraries can allow
unsafe usage. For example: