libgui|RowAtlasAllocator: Improved row-based atlas allocator

This version is more intelligent in keeping track of empty space.
There is no longer a "rover", using which allocations are done in
sequence. Instead, all remaining empty space is partitioned (in rows)
to acquire a suitable block from the atlas.

Optimization is only done if there is a significant portion of
unused space.