Replication: better way to send a preamble before RDB payload.

During the replication full resynchronization process, the RDB file is
transfered from the master to the slave. However there is a short
preamble to send, that is currently just the bulk payload length of the
file in the usual Redis form $..length..<CR><LF>.

This preamble used to be sent with a direct write call, assuming that
there was alway room in the socket output buffer to hold the few bytes
needed, however this does not scale in case we'll need to send more
stuff, and is not very robust code in general.

This commit introduces a more general mechanism to send a preamble up to
2GB in size (the max length of an sds string) in a non blocking way.
RDB file creation refactored to target non-disk target.
Define different types of RDB childs.

We need to remember what is the saving strategy of the current RDB child
process, since the configuration may be modified at runtime via CONFIG
SET and still we'll need to understand, when the child exists, what to
do and for what goal the process was initiated: to create an RDB file
on disk or to write stuff directly to slave's sockets.
Add some comments in syncCommand() to clarify RDB target.
rio.c refactoring before adding a new target.
rio.c: draft implementation of fdset target implemented.
Diskless replication: RDB -> slaves transfer draft implementation.
Diskless replication: parent-child pipe and a few TODOs.
rio.c fdset target: tolerate (and report) a subset of FDs in error.

Fdset target is used when we want to write an RDB file directly to
slave's sockets. In this setup as long as there is a single slave that
is still receiving our payload, we want to continue sennding instead of
aborting. However rio calls should abort of no FD is ok.

Also we want the errors reported so that we can signal the parent who is
ok and who is broken, so there is a new set integers with the state of
each fd. Zero is ok, non-zero is the errno of the failure, if avaialble,
or a generic EIO.
Diskless replication: child writes report to parent.
Diskless replication: read report from child.
Diskless replication: handle putting the slave online.
Diskless replication: trigger diskless RDB transfer if needed.
Diskless replication flag renamed repl_diskless -> repl_diskless_sync.
Diskless replication: trigger a BGSAVE after a config change.

If we turn from diskless to disk-based replication via CONFIG SET, we
need a way to start a BGSAVE if there are slaves alerady waiting for a
BGSAVE to start. Normally with disk-based replication we do it as soon
as the previous child exits, but when there is a configuration change
via CONFIG SET, we may have slaves in WAIT_BGSAVE_START state without
an RDB background process currently active.
Diskless replication: redis.conf and CONFIG SET/GET support.
Diskless replication: EOF:<mark> streaming support slave side.
syncReadLine(): actually enforce buffer size limits.
Diskless replication: don't enter the read-payload branch forever.
Diskless replication: swap inverted branches to compute read len.