Add String.split_at

While it is straightforward to split a string given
an offset in bytes from its beginning like this

    <<left::[binary, size(offset)], right::binary>> = string

splitting at grapheme boundary or using negative offset
is not so simple. Hence this function.
Merge pull request #2185 from alco/string-split_at

Add String.split_at
Correct Enum.group_by/3 typespec
Inline some map calls
Fix compiler crash for some map literals