Common: Don't always search from the beginning of a string in ReplaceAll

Prior to this change, it was possible to cause an infinite loop by making the string to be replaced and the replacing string the same thing.
This also changes the replacing in a way that doesn't require starting from the beginning of the string on each replacement iteration.

e.g.

std::string some_str = "test";
ReplaceAll(some_str, "test", "test");