Add NSCollection-enumeration functions.

Just convenience functions, eachBlock: and mapBlock:. They don't take
indices, and they work for both NSSets and NSArrays. eachBlock: is for
brevity (and not named each: to avoid interfering with the Nu addenda
that work with Nu blocks).
Expose the tabView in ViWindowController.
Don't instantly close the ViProject on load.

Can't be doing that if we want to save its state at the end :)
Close the project while views are still open.

When cleaning up, we want to make sure the project still has the views
open so it can serialize the window state.
Don't close the current project when changing directory.
Basic window state writing/reading.

Currently, we write all tabs and splits with their size information,
arbitrarily nested, plus their scroll info and their caret. We also
write the selected document.

Additionally, we can read the first level of splits, including opening
all the documents in that first level, setting their caret properly, and
scrolling them properly. We also properly select the right document. We
can also in theory read all of the tabs, though that's untested at the
moment.
Read nested splits from saved project file.
Merge branch 'arc-reactor' into project-layouts

Conflicts:
	app/ViProject.m
Merge branch 'arc-reactor' into project-layouts
Drop some retains to work properly with ARC.
Track line/column per document instead of caret/scroll point.

Trying to set the scroll point too early in the document loading process
was causing exceptions and general nastiness. This is already handled
when you try to set the text view to a particular line/column, so we
lean on that instead and track the user's current location based on that
information.
Switch some NSDictionaries to dictionary literals.
Switch projectInfo to dictionary literals.

Also drop in a clarifying comment on documentURLs lookup.
Open projects in the current window controller if clean.

A clean window controller is typically a window controller
in its initial state, with one open tab and one open
document, and the open document being an unknown
document rather than an actual file.

Typically in these cases Vico would simply change the
working directory. Now that projects remember their layout,
we load the project data in those situations.
Fix closing a window opened by a directory :e.

ViProject would start setting up before the window was
fully loaded, so certain document-related actions would take
place with uninitialized outlets (like the symbol controller).
We now wait for the window controller to tell us the window
has loaded before loading the documents for a project.
Drop a stray NSLog in ViStatusView.
Properly save project state when quitting.
Remove a possibly-not-useful guard in tab creation.

Originally, we were only creating a tab if the first document
we looked at at the top level was not also the only
document. It's unclear why that would be a necessary
condition, so that condition goes away until we can prove
that it's necessary (at which point we'll indicate why inline).
Leave the view and project closing to windowWillClose.

This in the documentController:didCloseAll:contextInfo:
method. If we wanted to correctly close the project in
windowWillClose, we needed to not do it first in that place.
This centralizes the window closing logic.
Select associated view when creating a tab for a document.

We weren't doing this before, which resulted in some
strange interactions when creating a tab from the project
loading logic. We would typically create an extra horizontal
split instead of loading correctly.

Once again, there's no clear reason why we wouldn't be
selecting the document view after creating the tab, and
barring an explanation, we're going to go ahead and do it.
Creating new tabs normally works correctly, as does
creating new tabs when the default for opening files is
doing it in a new tab.