Bug 879299: Add visibility_monitor to Contacts app

This commit significantly refactors how contacts are loaded and rendered in
the DOM.  Placeholder items are initially added to the list and then later
filled in when visible.  Images are lazy loaded as before, but will now be
removed when the contact is no longer visible.  Search has also been
refactored to help encapsulate the contacts_list and importer_ui internals.
Bug 879299: Move photo release to imgLoader
Bug 879299: Avoid new funcs in onscreen/offscreen
Bug 879299: Assign null instead of using `delete`
Bug 879299: Remove no-op className assignment
Bug 879299: s/getNodeForId/getNodeById/g
Bug 879299: Add comments as requested
Bug 879299: Fix css selector style
Bug 879299: Adjust lazy load of monitor
Bug 879299: Render photo for added contacts
Bug 879299: Remove stale showGroup() function
Bug 879299: Use idiomatic for loops, cache length
Bug 879299: Use a var for monitor maxDepth
Bug 879299: Select non-favorite nodes only
Bug 879299: Restore FB support in getContactById()
Bug 879299: Document appendToLists()
Bug 879299: Improve documentation of searchSource
Bug 879299: Fix image release
Bug 879299: Update for new monitor API
Bug 879299: Defer search string calculation

Profiling showed that the search string calculation was somewhat expensive.
Defer this work until either the list item is rendered or we need to pass
it to the search subsystem.

This saves us anywhere from 500ms to 1000ms for the loading the full
ureference-workload-heavy list on my Buri.