make virtualElements support binding without a colon like <!--ko switch-->
preserve the ability to supply a toJSON function on an object that is respected when calling ko.toJSON
Implement trackChanges and getChanges on observable arrays
Support sparse diffs in general
Make array change tracking return sparse diffs

… because it will be far cheaper for known operations
Beginning implementation of "skip diff algorithm for known operations"

Currently only knows about "push"
Support the remaining known operations
Enable change tracking tests in Node.js, and fix minified build
Switch to a "subscribe"-based API for receiving array changelists
Implement array change tracking as an extender that can be used with any observable.
Clarify that ordering of array changes is only undefined for replaced items (the added and deleted entries for that item can be in either order); the changes are always ordered by index.
Optimize cacheDiffForKnownOperation for similar operations.
Allow extender to not return a value if the target observable isn't replaced.
Ensure that the trackArrayChanges extender only modifies the target observable once
Merge pull request #1071 from knockout/1071-not-respecting-toJSON

ko.toJS() in 3.0.0beta omit toJSON function from output
Support binding to detached nodes

Specifically this handles the scenario of binding to nodes not yet added to the DOM, but will be added at some future point.
Make sure observable view model subscriptions are cleared correctly; add a spec that passed before the changes in f7f48b1715, and now passes again with the changes here.
Make sure "body" is always matched by domNodeIsAttachedToDocument (compareDocumentPosition doesn't consider a node contained within itself).
Added an extra condition to make sure that observables are compared correctly within an array. `typeof observable == "function"` returns true for observables, so they are treated like a predicate instead of value. With this check, the observables are compared like values.
Add tests showing proper behavior when removing or "destroying" observables in an observable array.
Exposed the $item variable within a foreach binding. $item refers to the raw, potentially wrapped value, where $data does not.
Don't unwrap observable array items in the foreach binding; instead let the binding context manage it. The result of this change is that if the observable is updated, only the underlying binding are updated (using the new observable view model system) instead of the whole template (re-rendering and re-bindings the elements).

Add tests for this change and the previous $item addition.
Use Jasmine's 'after' and custom 'restoreAfter' methods to clean up after tests that modify Knockout internals.