Restructure compositor layers to work with iframes.

When a frame is selected via set_ids, a tree of root compositor layers is
also created, matching the tree of pipelines in the frame. This
decouples the chronological ordering dependency for parent frames and child iframes when they
send CreateOrUpdateRootLayer & CreateOrUpdateDescendentLayer
messages.

Gotchas:
* iframes dont render when using the -o option (the compositor doesnt
  wait for the child iframe to render before exiting).
* layout task or script task failure on exit ("task * failed at sending on a
  closed channel"), this happens if the child iframe
  shares the same script task as the parent and can be avoided by adding
  the sandbox attribute to the iframe.

@pcwalton & @mrobinson
This would be better as

```rust
Some(ref mut layer) if layer.extra_data.borrow().id == LayerId::null() => {
    CompositorData::clear_all_tiles(layer.clone());
    layer
}
```

Having multiple things separated by semicolons on a single line gets hard to read.