chore(sauce): increase max-duration to avoid disconnects
tests: Move util tests to a new file
fix(compiler): Support camelCase property bindings

Fixes #1460

Closes #1462
style(utils): cleanup
feat(tests): run tests on all browsers

Changes:

- chore(travis): cleanup the configuration

- chore(travis): run test on IE10, IE11, Safari6 and Safari7

- fix(ShadowDomComponentFactory): Make Windows & Linux return the same response
    The "\n" would be stripped on windows platforms resulting in responses
    having a different content.

- refactor(Cookies): code cleanup

- fix(Cookies): fix for IE and Safari
    path should not be null, it would extrapolate to "null"

- test(http): disable a flaky expectation

- The error message varies across browsers:
        Dartium -> "Unexpected character"
        Dart2JS:
          - Chrome -> "Unexpected token"
          - Firefox -> "unexpected character"
          - IE -> "Invalid character"

- refactor(NgEvent): code cleanup

- text(NgEvent): fix the mousewheel event on IE & Safari

- chore(pubspec.yaml): add the browser_detect package

- test(ng_form_spec): fix an expectation

- test(ng_form_spec): Fix a failing test on IE

    ref https://github.com/angular/angular.dart/issues/1309

- refactor(ng_model_spec): code cleanup

- test(ng_model_spec): el.selectionStart and el.selectionEnd are handled differently on IE

- test(WebPlatform): disable web components tests when shim is needed

- test(NgModel): fix input type=color default value

    - "#000000" for Chrome and Firefox
    - "" for Safari7 and IE11

- refactor(InputSelect): code cleanup

- fix(ng_model_select): IE has its own way of handling options

- test(select multiple): Need to explicitely select option on IE

- test(number inputs): Safari6 keep the previous value on invalid input

- test: fix broken Safari 6 animation bugs

- test: add missing argument type
chore(travis): temporary disable IE & Safari when running tests on travis

Closes #1464
feat(eventHandler): Support snake-case event names instead of camelCase.

Closes #1434
Closes #1478

Closes #1477
fix(DirectiveInjector): fix exceptions

Closes #1484
doc(routing): event.allowLeave() is on the PreLeave event since 0.4.21

Closes #1469
perf(util): call toLowerCase() only where needed

Closes #1468
chore(ng-class benchamrk): fixes

Closes #1465
test(parser_spec): fix analyzer warnings

Closes #1430
feat(scope): add new createProtoChild method

Internalizes PrototypeMap, and allows for easier switch to ContextLocals.
feat(compiler): support ScopeAware for decorators

Even though decorators can safely inject scope (even after the proposed
context change), they might pick up ScopeAware from a base class shared
with components. Instead of manually calling super.scope = scope, we
support ScopeAware for decorators (similarly to Attach/DetachAware.)

There is no performance reduction on the tree benchmark.
refactor(NgElement): NgElement inject RootScope instead of Scope.

NgElement only uses scope to access rootScope, so now we directly inject
RootScope.

This is needed for future change #1429 which disallows Scope injection
into controllers. Since NgElement depends on scope it would also be
disallowed, unless we change it to directly use RootScope.
refactor(DirectiveInjector): better var names and comments
feat(scope): component is the new context

BREAKING CHANGE:

Scope context is set to the component instance that trigged the creation
of the scope (previously it was of a PrototypeMap.)

Repercussions:
1) You can not inject a scope in a component or in the root context any
more.

As the Scope context is set to the Component instance, the scope could
not be injected any more. Components should implements the "ScopeAware"
interface and declare a "scope" setter in order to get a reference to
the scope.

before:

     @Component(...)
     class MyComponent {
       Watch watch;
       Scope scope;

       MyComponent(Dependency myDep, Scope scope) {
          watch = scope.rootScope.watch("expression", (v, p) => ...);
       }
     }

after:

     @Component(...)
     class MyComponent implements ScopeAware {
       Watch watch;

       MyComponent(Dependency myDep) {
         // It is an error to add a Scope argument to the
         // ctor and will result in a DI circular dependency error
         // The scope is never accessible in the class constructor
       }

       void set scope(Scope scope) {
          // This setter gets called to initialize the scope
          watch = scope.watch("expression", (v, p) => ...);
       }
     }

or:

     @Component(...)
     class MyComponent implements ScopeAware {
       Scope scope;

       MyComponent(Dependency myDep) {
         // It is an error to add a Scope argument to the
         // ctor and will result in a DI circular dependency error
         // The scope is never accessible in the class constructor
       }
     }

2) The parent component to an NgForm must have a "$name" field to store
   the form instance.

closes #919
closes #917