feat($parse): secure expressions by hiding "private" properties

BREAKING CHANGE:
This commit introduces the notion of "private" properties (properties
whose names begin and/or end with an underscore) on the scope chain.
These properties will not be available to Angular expressions (i.e. {{
}} interpolation in templates and strings passed to `$parse`)  They are
freely available to JavaScript code (as before).

Motivation
----------
Angular expressions execute in a limited context.  They do not have
direct access to the global scope, Window, Document or the Function
constructor.  However, they have direct access to names/properties on
the scope chain.  It has been a long standing best practice to keep
sensitive APIs outside of the scope chain (in a closure or your
controller.)  That's easier said that done for two reasons: (1)
JavaScript does not have a notion of private properties so if you need
someone on the scope chain for JavaScript use, you also expose it to
Angular expressions, and (2) the new "controller as" syntax that's now
in increased usage exposes the entire controller on the scope chain
greatly increaing the exposed surface.  Though Angular expressions are
written and controlled by the developer, they (1) typically deal with
user input and (2) don't get the kind of test coverage that JavaScript
code would.  This commit provides a way, via a naming convention, to
allow publishing/restricting properties from controllers/scopes to
Angular expressions enabling one to only expose those properties that
are actually needed by the expressions.
fix(ngEventDirectives): parse expression only once during compile phase.
docs($location): update paramValue description for search()

search() supports an array for paramValue, but this is not described in the docs.
docs($parse): Fix typo
docs(guide/contribute): remove redundancy and link to CONTRIBUTING.md
style: remove ws
fix(ngIf): destroy child scope when destroying DOM
fix(ngModel): deregister from the form on scope not DOM destruction

Due to animations, DOM might get destroyed much later than scope and so the element $destroy event
might get fired outside of $digest, which causes changes to the validation model go unobserved
until the next digest. By deregistering on scope  event, the deregistration always happens
in $digest and the form validation model changes will be observed.

Closes #4226
Closes #4779
chore(docs): fix ordering of docs in the guide
docs($log): add the word "safely" to clarify

I was reading the doc and had to read the code to be sure it was safe.  Spelling it out seems easier.

Closes #4760
docs(overview): improve readability

Inserted a couple of line breaks to increase readability.

Closes #4756
docs(guide/understanding-controllers): fix typo in example

Broken - $scope.spicy = 'very';
Works - $scope.spice = 'very';

Closes #4752
docs($http): note that default $http headers can be overridden

Closes #4750
docs(input): fix typo

Closes #4734
docs(guide): add SEO4Ajax to the SEO tools list

Closes #4748
docs(guide/directive): fix transclusion example

The example about transclusion and scopes worked only because the order of `scope` and `element`
arguments is wrong, which means that the `name' property of the scope is not really being updated.
To really work, the directive has to define its own scope, either a new child scope or, as is more
common with transclusion, an isolated scope.

Closes #4774
fix(ngdocs): `shortDescription()` should not error if no `description`
fix(ngdocs): create mock Doc objects correctly
chore(grunt): add test:docsgen to ci checks
chore(ngAnimate): ensure elapsedTime values are in seconds and millseconds