Avoid processing columns if there aren't any to allow empty tables.
Merge remote-tracking branch 'upstream/master'
Merge remote-tracking branch 'upstream/master'
Fixes #2532940
Merge remote-tracking branch 'upstream/master'
Merge remote-tracking branch 'upstream/master'
Expose _serialize as stringify, for consistency with Y.QueryString
modify api so Y.IO.stringify('#my-form') works
improve argument names and docs
fix typo
make options optional
avoid Y.Lang
Fixes #2532810

The third argument to set (or _set) is not just for events.
Its purpose is to establish the reason for setting the attribute.
In Widgets, this usually means the source of the change by
indicating {src: 'UI'} (or its pre-defined constant).
Though it is usually used to avoid reflecting into the UI
what came from the UI, and is something done through events,
it is still useful even if you don't have a UI or events.

I have added those opts to both the setter and the validator
so they can decide on accepting or rejecting the value
based on the origin of the data.

Provided an extra test to try the setter with the extra argument
This change should be fully backward compatible.

Inadvertently stripped trailing spaces on the changed sources.
Changed the landing page to describe the opts argument.
Corresponds to issue #2532810 pushed in a separate commit.
Make opts an empty object when undefined.
When opts is passed as a string, turn it into an object with a single property 'src' with the original opts
as its value set to that string.
Added a test for that.
clarify code
add unit tests to event-gestures
add more event-tap unit tests
Stubbed-in some io-form serialization tests.
Merge pull request #1 from ericf/io-serialize

Stubbed-in some io-form serialization tests.
Add code comments to io-xdr.
Add proper IO XDR tests, which leverage EchoEcho.