[LayoutNG] A more efficient/correct implementation of ExclusionSpace.

This uses a modified shelf algorithm, which exploits some properties of floats
much more aggressively than what we have in legacy/current I believe.

I added comments and diagrams everywhere. There are some things that can be done
to initially speed this up, like using std::binary_search to jump into the
appropriate place in vectors. So if you think this is worth it, let me know.

There is one quirk which I've noted with one of the unit-tests. Its a bunch of
extra code to support this, so i think the quirk is fine at the moment.

Bug: 635619
Cq-Include-Trybots: master.tryserver.chromium.linux:linux_layout_tests_layout_ng
Change-Id: Iea41bb82518232388042aef1645ea9f87ea71f38
Reviewed-on: https://chromium-review.googlesource.com/830970
Commit-Queue: Ian Kilpatrick <ikilpatrick@chromium.org>
Reviewed-by: Morten Stenshorne <mstensho@chromium.org>
Reviewed-by: Koji Ishii <kojii@chromium.org>
Cr-Commit-Position: refs/heads/master@{#527829}
32 files changed