Don't use NSScreen equality checks and cache screen managers

This fixes two bugs:

  - When adding/removing displays, screens would stop tiling because the screen
    manager would be cached, but +[NSScreen screens] would return new instances.
    Comparison was done on an instance-by-instance basis so when getting windows
    for the screen windows would return the new instance, while the screen
    manager would have the old instance. The solution is to the use the static
    screen identifier obtained using private APIs.

  - Because we cache screen managers by screen identifiers adding and removing
    displays doesn't reset layouts.

Closes #215