Tweak the first: Highly performant cell and row locators

For reasons I didn't immediately see, the table row iterator was very slow.
Tables are now largely powered by the 'find_rows_by_cells' method, but I tried
to maintain the existing interfaces while letting them benefit from the speedups.

As a side-effect, it was worthwhile to functionalize row creation, so it's pretty
easy to make rows now.
Tweak the second: Table.Row is easier to instantiate

Namely, with a `<tr>` element and a `Table` instance. Now, you should
be able to do a silly thing like this:

row = Table.Row(element(table.create_row_from_element(row_element).table.find_row({'header': value})), table)
Tweak the third: Table constructor is easier to work with for normal tables

Many (most?) tables in CFME are "normal" tables, with thead and tbody children.
Table now assumes it's dealing with such a table. In cases where the tables are
abnormal, and the header body rows are in different tables, SplitTable joins the
party to handle the ridiculousness.

This commit also includes additional docs.
Existing Table instances converted to SplitTable where needed