Implement StorageItem plugin system. 

Includes an initial resize plugin that resizes 
and uploads a few reduced size images to the same
storage location as the original image and records
them in metadata.
Change StorageItemPlugin to be an interface instead of an abstract class.
Rename to StorageItemListener and chance process(…) to afterSave(…).
Fix bug that prevents multi-key string indexes from working correctly when using RecordString3.
Optimizes reference resolving when using SQL source tables.
Adds ability to specify event date precision
Initial support for visibility index.
Adds CollectionUtils.recursiveIterable API.
Fixes State.getVisibilityAwareTypeId sometimes returning the wrong UUID.
Adds the ability to query for visibility hidden items.
Adds support for visibility flag in type-specific indexes, not just global ones.
Changes State.getVisibilityAwareTypeId to only use the last visibility index value to change the type ID so that its behavior is more predictable when using multiple visibility indexes.
Makes sure that the state status is retained when recreating the object because of the visibility type ID.
Adds HtmlWriter delegate getter/setter.
Renames most HtmlWriter methods to be prefixed with write so that its meanings are more clear when it's used in another class (e.g. subclass).
Fixes all warnings.
Hides the HtmlWriter.Area class since it's really internal.
Merge branch 'release/2.0'
Merge branch 'release/2.0' into feature/storageitemplugin
Renames StorageItemImageResizePlugin to ImageResizeStorageItemListener so that it's more consistent with the StorageItemListener interface.