Historical reasons mostly.
AFAIK, the only thing tying str to the language is string literals (both in expressions and in patterns), so str would still has to be a lang item even if moved to the library.
Unfortunately, simply moving str to the library now is a breaking change, because built-in types are subject to some special weird name resolution rules.