Returns the next token in the stream, or null at EOS.
/// When possible, the input Token should be used as the
/// returned Token (this gives fastest tokenization
/// performance), but this is not required and a new Token
/// may be returned. Callers may re-use a single Token
/// instance for successive calls to this method.
///
/// This implicitly defines a "contract" between
/// consumers (callers of this method) and
/// producers (implementations of this method
/// that are the source for tokens):
///
/// - A consumer must fully consume the previously
/// returned Token before calling this method again.
/// - A producer must call {@link Token#Clear()}
/// before setting the fields in it & returning it
///
/// Note that a {@link TokenFilter} is considered a consumer.
///
///