Add beforechange event type and provide key with change events

If you know ahead of time that you only want to listen for changes for a specific property, the foo:change type events can be useful.  If you want to listen for changes on all properties, the change event becomes more useful if it provides information on what changed.  And the beforechange event allows listeners to access values before they change.
Handle beforechange events for bound properties
Getting explicit about which type
Listen for property changes in layer group

This avoids a future bug when the ol.ObjectEventType.CHANGE value becomes something different than the goog.events.EventType.CHANGE value.
Using unique event type values for distinct events

Any event target can be used to dispatch generic goog.events.Event instances with an arbitrary type.  In cases where we dispatch custom events, we should not use type values that collide with those used for generic events (at least internally).  This allows listeners a better chance of knowing what kind of argument they will receive.

As subsequent change will clean up the enumeration and add a bit more consistency.
Make enum property name like its value

Where an enum value is used as an event type, it should be alllowercase (to follow DOM events).  Property names should be ALLUPPERCASE in this case (just as camelCase and PascalCase are converted to CONSTANT_CASE).
More consistent event types
Export a getKey method on ol.ObjectEvent
Component for assembling feature transactions
Add method to restore original feature attributes
Add the ability to roll back a transaction (WIP)
No longer depend on ol.Feature's removed original management

Instead, we use the new change event from ol.Object.
Distinguish between loading and adding features
Use the new BEFOREPROPERTYCHANGE event