In redoLayout we check the state: if there is no state we
initialize it.

The state is diffed against the list of windows produced by the
underlying layout: removed windows get deleted and new ones
decorated by createDecos, which will call decorate to decide if
a window must be given a Rectangle, in which case a decoration
window will be created.

After that we resync the updated state with the windows' list and
then we process the resynced stated (as we do with a new state).

First we map the decoration windows, we update each decoration to
reflect any decorated window's change, and we insert, in the list
of windows and rectangles returned by the underlying layout, the
decoration for each window. This way xmonad will restack the
decorations and their windows accordingly. At the end we remove
invisible/stacked windows.

Message handling is quite simple: when needed we release the state
component of the DecorationLayoutModifier. Otherwise we call
handleEvent, which will call the appropriate DecorationStyle
methods to perform its tasks.

Given the theme's decoration width and height, the screen
rectangle, the windows stack, the list of windows and
rectangles returned by the underlying layout and window to be
decorated, tupled with its rectangle, produce a JustRectangle or Nothing if the window is not to be decorated.