#28709: Improve/introduce Customizer JS models for Controls, Sections, and Panels

https://core.trac.wordpress.org/ticket/28709

 - [x] Re-sort controls, sections, panels when their priorities change
 - [x] Toggle visibility of section when all controls are removed or become in`active`
 - [x] Make sure that controls can be moved between sections purely by changing their `section` property.
 - [x] Introduce a `$type` for Customizer sections and panels, and let there be associated constructor overrides in JS.
 - [x] Incorporate all accordion logic into the Customizer `Section` and `Panel` models.
 - [x] Hide/collapse section/panel when all children are removed.
 - [x] This should result in the colors section and wigets panel being hidden, but it's not sticking right now: `wp.customize.section( 'colors' ).active( false )` and `wp.customize.panel( 'widgets' ).active( false )`
 - [x] When reordering widgets in a sidebar, update the `priority` state in conjunction with the movement of the DOM element, or the DOM change will be lost. 
 - [x] Introduce `active_callback` to Panels and Sections.
 - [x] Use Section `active` state instead of using sidebar_widgets control `active` state change to manipulate UI.
 - [ ] Add unit tests for JS models (initial tests committed).
 - [x] Use `onToggleActive` or `onActiveChange` instead of just `toggleActive`. Same goes for `expanded` state.
 - [ ] Work through use cases for dynamic-creation of panels, sections, controls in relation to the Menu Customizer and Customize Posts plugins. Satisfy use cases.
 - [ ] Update logic for adding widget controls to use new API (adding widgets is using the old pseudo-API and it is currently broken); allow controls to be added manually.
 - [ ] Work with Nick Halsey to make sure that dynamically-created sections and controls suit the needs of Menu Customizer, and make sure that it works for other plugins like Customize Posts.
 - [ ] Build upon the initial QUnit tests to add coverage for existing JS API and newly added API (#28579).
 - [ ] Get feedback from other Core devs and get initial patch committed.

# `active`/`expanded` APIs

 - [x] Allow Panels' and Sections'  `expand`/`collapse` and `activate`/`deactivate` methods to take an optional `args` object which gets added to a queue of options processed by the `onActiveChange`/`onExpandedChange` handlers. This allows, for instance, `section.collapse( { duration: 0 } )` and `section.expand( { allowMultiple: true } )` calls to be possible.
 - [x] Depends on previous: Make sure top-level sections are collapsed before opening the panel, see #36.
 - [ ] Depends on previous: Fix mispositioned panel contents when the parent section siblings' active states change, i.e. due to navigating around in the preview when the panel is open. See https://github.com/xwpco/wordpress-develop/pull/36#issuecomment-60266555. Harden the logic for animating the Customizer panel into view.
 - [x] Depends on previous: Make sure that accordion changes continue to work with Widgets, where dragging allows two sections to be open at the same time (extend API to allow multiple sections to be opened concurrently). For instance, implement `section.expand( { allowMultiple: true } )`.

# Deep linking

 - [x] Allow sections, controls, panels to be deep-linked. 
 - [x] Implement `focus()`. Widgets should be updated to use this as well. Focusing on a control should cause a containing section to be expanded, as well as its containing panel. See [#29529](https://core.trac.wordpress.org/ticket/29529).
This `150` value seems to be used several times in this PR alone - can it be abstracted out? Wondering if there's a case where cognitive accessibility might be improved if the value could be filtered to slow animation right down.