Refactor scroll updates during flexbox layout.

When there are nested flexboxes, the current code does some O(N^2)
work to update scrolling information after flexing has finished.  This
change streamlines the process for performing flex layout and updating
scrollbars into three distinct phases, controlled by the highest-level
flexbox in the layout tree:

1. Perform flex layout on descendants; any blocks with overflow:auto
scrollbars may add/remove scrollbars, but they will not run the normal
second-pass layout after changing scrollbars, and they will not clamp
their existing scroll positions.

2. If, during the first pass, any descendant added or removed
scrollbars, run a second flex layout pass, but don't allow any
descendants to add or remove scrollbars.

3. After the second pass, go through and clamp the scroll positions
on all scrolling descendants.

BUG=593209,600036

Review-Url: https://codereview.chromium.org/1930183002
Cr-Commit-Position: refs/heads/master@{#397888}
9 files changed