Finished rewrite with better RPC

Ugh.  It's complicated.  Mostly the work is done though.  Always do RPC
calls from a goroutine.  The peer object must be fenced with Grab() and
Release().  Also if you get the peer from fs.peers, you must guard that
access with fs.bgmu.Lock()/Unlock()

So, suppose I know I want talk to dbid 3:

fs.bgmu.Lock()
peer := fs.peers[3]
if !peer {
	fs.bgmu.Unlock()
	return
}
// theoretically this needs to happen before unlock
peer.Grab()
defer peer.Release()
fs.bgmu.Unlock() // unlock ASAP, before doing rpc below

// now after all that crap to access the peer safely, the easy part:

resp, err := peer.Call(RequestTxCall{ ... opts ... })
if err != nil {
	return err
}
t, ok := resp.(TxResponseCall); !ok {
	return errors.New("Server responded weird:", resp.Name())
}
// now you do stuff with t