HA uses shared timestamp (last modified time), and negotiates concurrent starts, and handles former master recovery

resubmit of https://github.com/brooklyncentral/brooklyn/pull/1487, adding related code review comments from https://github.com/brooklyncentral/brooklyn/pull/1464, and solving multi-master situations
Why use repeater rather than:

    Asserts.succeedsEventually(new Runnable() {
        public void run() {
            ....
            String errmsg = nodes.size()+" nodes: "+masters+" masters + "+standbys+" standbys; "
                    + memento.getManagementNodes().size()+" saved, "
                    + memento.getMasterNodeId()+" master, "+savedMasters+" savedMasters + "+savedStandbys+" savedStandbys"
            assertEquals(masters, 1, errmsg);
            assertEquals(standbys, nodes.size()-1, errmsg);
            assertEquals(savedMasters, 1, errmsg);
            assertEquals(savedStandbys, nodes.size-1, errmsg);
        }});

This will save you getting a log message every 1ms as well (just get the testng message at the end if it fails).