Bugs in `CharTokenizer` class
**Describe the bug**
Apparently class `CharTokenizer` needs to be rewritten.
1. The tokenizer does not add special tokens such as `<EOS>` and `<CLS>` automatically, so it is not consistent with tokenizers like `yttm`.
2. To add special tokens, it is not enough to insert something like `"<EOS>"` into input text because substring `"<EOS>"` will be interpreted not like special token but as 5 tokens `['<', 'E', 'O', 'S', '>']`. So a class user has to identify a character (e.g. `'@'`) which does not occur in a tokenized text, insert it into the text in required positions, and pass this character as a special token parameter to the class constructor. It is inconvenient. 
3. A vocabulary file cannot contain space character. If space character is present in `self.vocab` it will be replaced with an empty string. So space character has to be passed as a special token. This feature is not documented.
4. Special token attributes like `self.unk_token` are not defined but used in properties like `unk_id`.
