Fix spurious WindowErrors in logs

When a window is destoryed, it gives both UmmapNotify and DestroyNotify events.
Previously, when we received a DestroyNotify we would try and issue an Unmap
for it (since unmanage() tried to unmap and withdraw windows). Obviously, you
can't unmap a window that has been destroyed and doesn't exist, so this was
wrong; with this patch we only unmap windows that have sent UnmapNotify.

Further, when we unmap windows that are going to be destroyed (as in most cases
when we receive an UnmapNotify just before a DestroyNotify), we could be trying
to unmap a window that doesn't exist. This commit switches property setting and
unmapping to using checked requests, so as to fail immediately (and not get
some WindowError in the queue). This allows us to catch the WindowErrors where
we expect them, instead of just getting them dumped in the catch-all, thus
cleaning up the extra log noise.

Closes #510