Reworking the locking structure to have a two-phased lock (collection and individual blocks) to help avoid blocking.

- Added some contracts to ensure expected use (and to prevent unlocked usages).
- Created some short-lived lock objects that acquire all the needed locks.
- Updated usage pattern for locking.
- Removed access to the block collection's Lock
- Renamed BlockOwnerCollection to ProjectBlockCollection to fit more with naming conventions.
Renaming various classes and files to make the names easier to understand to new developers.

- A "plugin" is a non-project level entity.
- A "project plugin" is a project-specific plugin (previously controller).
Adding in the ability to have plugins that aren't associated with a project.

- Renamed TryGet to TryGetProjectPlugin() to match the names and functionality.
More work establishing how plugins register themselves with other plugins.
Added a Get() method for retrieving a plugin by name.
Adding in the stubs for the persistence framework and filesystem persistence plugin.
Adding in some basic project macros and unit tests.
Work on getting the filesystem to write out an empty project file.
Work on getting the file persistent code serialized to the output file.
Work on persisting the block types.
Work on cleaning up the file system and getting everything written out.
Cleaning up and reworking the serialization side of a project.
Work on getting the reading of project files working properly.

Currently have block types, structure, settings, and plugins loading. Still need to get block contents and parsed data importing.
Work on deserialization process for content and content data.
Additional work on the reading process for filesystem persistence.
Added persistence of plugins and data associated with each text span.

- Expanded the persistence unit tests to include additional information.
- Renamed the Name property in IPlugin to Key to make it more specific of its purpose.
- Added a Key to all IProjectPlugin for later lookup and configuration.
Additional work on getting the text spans written and saved along with associated unit tests.
Broken the various components of the filesystem persistence writer into different classes to keep them small and isolated (SRP).