React attached all its listeners to document, which is why two React versions on one page could not coexist and why mixing React with anything else was fragile.
// 16: every handler, on document
// 17: attached to the ROOT container instead
// what breaks:
// e.stopPropagation() in a NON-React handler on document
// no longer prevents a React handler from firing
//
// and what it enables:
// two React versions on one page, upgraded independently
The coexistence is the entire purpose of the release: an application that cannot upgrade because one widget cannot now upgrades everything else. The breakage is narrow and specific — code calling stopPropagation on a document-level listener to suppress React — and it appears in jQuery integrations more than anywhere else. Testing any page that mixes React with another library is the whole migration.