[MAJOR] implement the Fast Weighted Round Robin (FWRR) algo

This round robin algorithm was written from trees, so that we
do not have to recompute any table when changing server weights.
This solution allows on-the-fly weight adjustments with immediate
effect on the load distribution.

There is still a limitation due to 32-bit computations, to about
2000 servers at full scale (weight 255), or more servers with
lower weights. Basically, sum(srv.weight)*4096 must be below 2^31.

Test configurations and an example program used to develop the
tree will be added next.

Many changes have been brought to the weights computations and
variables in order to accomodate for the possiblity of a server to
be running but disabled from load balancing due to a null weight.
diff --git a/include/proto/backend.h b/include/proto/backend.h
index 8fa8c83..444e53a 100644
--- a/include/proto/backend.h
+++ b/include/proto/backend.h
@@ -39,10 +39,10 @@
 int backend_parse_balance(const char **args, char *err,
 			  int errlen, struct proxy *curproxy);
 
-void recount_servers(struct proxy *px);
 void recalc_server_map(struct proxy *px);
 int be_downtime(struct proxy *px);
 void init_server_map(struct proxy *p);
+void fwrr_init_server_groups(struct proxy *p);
 
 /*
  * This function tries to find a running server with free connection slots for
@@ -118,7 +118,9 @@
 		recalc_server_map(px);
 
 	l = h = 0;
-	if (px->srv_act > 1 || (px->srv_act == 0 && px->srv_bck > 1)) {
+
+	/* note: we won't hash if there's only one server left */
+	if (px->lbprm.tot_used > 1) {
 		while ((l + sizeof (int)) <= len) {
 			h ^= ntohl(*(unsigned int *)(&addr[l]));
 			l += sizeof (int);