Add explicit text nodes to zoom in/out controls

IE < 9 does not support CSS content properties, so the +/- does not
get rendered. Instead, add the +/- as text nodes when creating the
DOM nodes for the control.
Improve zoom/attribution controls for IE < 9

IE < 9 does not support RGBA transparency, so instead fall back to
more readable alternatives where possible.
Add configurable zoom in/out label options
Prevent the default image dragging behavior in IE < 9
Fix rendering issues when scaling and translating in IE7-8

Adds support for the IE-specific Matrix filter and adds fixes
that enable IE7-8 to render transformations without distortion
Add fix for IE8 to apply the matrix transform
Add ol.MapBrowserEvent#getBrowserEvent
Refine IE matrix transforms

I moved out the actual setting of the matrix to a separate function,
preferring to replace ONLY the matrix filter, not any other filters,
and only set the z-index if it had not yet been set.

I also added better browser detection for IE11, which is reported
incorrectly by the closure library.
Fix issue with IE9+ transform origin
Wrap setOpacity to make it IE7-8 compatible
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
Add gutter option to ol.source.TileWMS
Add gutter support to TileUrlFunction
Add ol.source.Tile#getGutter