feat($debounce): add new service that "debounces" calls to a function

This is a useful service in general but, in particular, it also is needed
to support the `ng-model-options` directive, that allows users to "debounce"
the ui event triggers that update the ng-model value.
WIP - fixes to the $debounce service after review

- Add option to skip $apply
- Only run $apply when the wrapped function is called, and not when we
are cancelling timeouts.
-
WIP: fix whitespace errors
WIP: fix bad style and add names to anonymous functions
WIP: refactoring after review with Igor

We are not going to expose promises from this service for now since it
is not a common use case and it is easier to add them in later than to
remove them if they cause problems.  Moreover it makes the code considerable
simpler.

The code will implicitly call $apply if it calls the wrapped function
asynchronously, as it is inside the $timeout handler.  The code will
not explicitly call $apply if it is calling the wrapped function
synchronously (i.e. if `immediate` is `true`) - we will leave it up to
the calling environment to control that.  In most cases the caller will
already be in an apply block.
WIP: further tweaks

Remove unneeded parameters and move delayComplete outside of debouncedFn.