raft: introduce log storage interface.

This change splits the raftLog.entries array into an in-memory
"unstable" list and a pluggable interface for retrieving entries that
have been persisted to disk. An in-memory implementation of this
interface is provided which behaves the same as the old version;
in a future commit etcdserver could replace the MemoryStorage with
one backed by the WAL.
*: support updating advertise-peer-url
Users might want to update the peerurl of the etcd member in several cases.
For example, if the IP address of the physical machine etcd running on is
changed, user need to update the adversite-pee-rurl accordingly.
This commit makes etcd support updating the advertise-peer-url of its members.
raft: update unstable when calling stableTo with 0

It should update unstable in this case because it may happen that raft
only writes entry 0 into stable storage.
raft: nodes return sorted ids

This makes raft.softState return the same result when its soft state is
not changed.
Merge pull request #1692 from yichengq/221

raft: nodes return sorted ids
Merge pull request #1679 from xiang90/peerurl

update peer url
Merge pull request #1689 from yichengq/219

raft: update unstable when calling stableTo with 0
etcdserver: use member instead of node at etcd level
Merge pull request #1694 from xiang90/use_member

etcdserver: use member instead of node at etcd level
raft: add comment string for TestNodeStart
Merge pull request #1695 from xiang90/nodestart

raft: add comment string for TestNodeStart
raft: add a test for node.Tick
etcdserver: ensure initial-advertise-peer-urls match initial-cluster

This adds a check to setupCluster to ensure that the list of URLs
specified in `initial-advertise-peer-urls` matches those configured in
`initial-cluster` for this node. Also updates the documentation to
clarify this and address some changes in wording.
etcdserver: move peer URLs check to config
integration: fix test to propagate NewServer errors
Require a non-nil Storage parameter in newLog.

Callers must in general have a reference to their Storage objects to
transfer entries from Ready to Storage, so it doesn't make sense to
create a hidden Storage for them.

By explicitly creating Storage objects in tests we can remove a
few casts of raftLog's storage field.
raft: stop the node synchronously
integration: remove unnecessary t.Testing argument
Merge pull request #1676 from jonboulle/doc_initial_cluster

etcdserver: validate and document initial-advertise-peer-urls
integration: add increase cluster size test