Fix TwoWaySearcher to work when used with periodic needles.

There is a check in TwoWaySearcher::new to determine whether the needle is periodic. This is needed because during searching when a match fails, we cannot advance the position by the entire length of the needle when it is periodic, but can only advance by the length of the period.

The reason "bananas".contains("nana") (and similar searches) were returning false was because the periodicity check was wrong.

Closes #16589

Also, thanks to @Gankro, who came up with many buggy examples.
Hm, I'm not 100% sure this handles not-exactly-period strings correctly, e.g. `naXYZna`, `naxyzna`, [playpen][pp]
(I don't know this algorithm, so it might be doing the right thing, but it certainly seems weird that those two differ.)

[pp]: http://play.rust-lang.org/?run=1&code=fn%20maximal_suffix%20arr%3A%20%26%20u8%20%2C%20reversed%3A%20bool%20%20-%3E%20%20uint%2C%20uint%20%20{%20let%20mut%20left%20%20%20-1%3B%20%2F%2F%20Corresponds%20to%20i%20in%20the%20paper%20let%20mut%20right%20%20%200%3B%20%2F%2F%20Corresponds%20to%20j%20in%20the%20paper%20let%20mut%20offset%20%20%201%3B%20%2F%2F%20Corresponds%20to%20k%20in%20the%20paper%20let%20mut%20period%20%20%201%3B%20%2F%2F%20Corresponds%20to%20p%20in%20the%20paper%20while%20right%20%2B%20offset%20%20%20arr.len%20%20%20{%20let%20a%3B%20let%20b%3B%20if%20reversed%20{%20a%20%20%20arr%20left%20%2B%20offset%20%3B%20b%20%20%20arr%20right%20%2B%20offset%20%3B%20}%20else%20{%20a%20%20%20arr%20right%20%2B%20offset%20%3B%20b%20%20%20arr%20left%20%2B%20offset%20%3B%20}%20if%20a%20%20%20b%20{%20%2F%2F%20Suffix%20is%20smaller%2C%20period%20is%20entire%20prefix%20so%20far.%20right%20%2B%20%20offset%3B%20offset%20%20%201%3B%20period%20%20%20right%20-%20left%3B%20}%20else%20if%20a%20%20%20%20b%20{%20%2F%2F%20Advance%20through%20repetition%20of%20the%20current%20period.%20if%20offset%20%20%20%20period%20{%20right%20%2B%20%20offset%3B%20offset%20%20%201%3B%20}%20else%20{%20offset%20%2B%20%201%3B%20}%20}%20else%20{%20%2F%2F%20Suffix%20is%20larger%2C%20start%20over%20from%20current%20LOCATION.%20left%20%20%20right%3B%20right%20%2B%20%201%3B%20offset%20%20%201%3B%20period%20%20%201%3B%20}%20}%20%20left%20%2B%201%2C%20period%20%20}%20fn%20test%20s%3A%20%26str%20%20{%20let%20%20cp1%2Cp1%20%20%20%20maximal_suffix%20s.as_bytes%20%20%2C%20true%20%3B%20let%20%20cp2%2Cp2%20%20%20%20maximal_suffix%20s.as_bytes%20%20%2C%20false%20%3B%20let%20%20cp%2C%20p%20%20%20%20if%20cp1%20%3E%20cp2%20{%20%20cp1%2C%20p1%20%20}%20else%20{%20%20cp2%2C%20p2%20%20}%3B%20PRINTln!%20%20Testing%20{}%20critPos%20%20%20{}%3B%20period%20%20%20{}%20{}%20{}%20%2C%20s%2C%20cp%2C%20p%2C%20s.slice_to%20cp%20%2C%20s.slice%20p%2C%20p%20%2B%20cp%20%20%3B%20}%20fn%20main%20%20%20{%20test%20%20naxyzna%20%20%3B%20test%20%20naXYZna%20%20%3B%20}