Switch to a radix tree to speed up Find()

We're always doing prefix searches, so this patch moves to a data
structure optimized for that.

Representative benchmark:

Old:

Summary:
  Total:	7.4458 secs.
  Slowest:	0.0700 secs.
  Fastest:	0.0012 secs.
  Average:	0.0371 secs.
  Requests/sec:	1343.0442
  Total Data Received:	6100000 bytes.
  Response Size per Request:	610 bytes.

Status code distribution:
  [200]	10000 responses

Response time histogram:
  0.001 [1]	|
  0.008 [40]	|
  0.015 [32]	|
  0.022 [105]	|∎
  0.029 [1377]	|∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
  0.036 [2816]	|∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
  0.042 [3148]	|∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
  0.049 [1805]	|∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
  0.056 [482]	|∎∎∎∎∎∎
  0.063 [142]	|∎
  0.070 [52]	|

Latency distribution:
  10% in 0.0269 secs.
  25% in 0.0312 secs.
  50% in 0.0369 secs.
  75% in 0.0424 secs.
  90% in 0.0473 secs.
  95% in 0.0509 secs.
  99% in 0.0596 secs.

New:

Summary:
  Total:	0.9494 secs.
  Slowest:	0.0242 secs.
  Fastest:	0.0001 secs.
  Average:	0.0047 secs.
  Requests/sec:	10532.9211
  Total Data Received:	6100000 bytes.
  Response Size per Request:	610 bytes.

Status code distribution:
  [200]	10000 responses

Response time histogram:
  0.000 [1]	|
  0.003 [2628]	|∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
  0.005 [3752]	|∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
  0.007 [1981]	|∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
  0.010 [1034]	|∎∎∎∎∎∎∎∎∎∎∎
  0.012 [233]	|∎∎
  0.015 [163]	|∎
  0.017 [71]	|
  0.019 [53]	|
  0.022 [38]	|
  0.024 [46]	|

Latency distribution:
  10% in 0.0013 secs.
  25% in 0.0025 secs.
  50% in 0.0039 secs.
  75% in 0.0061 secs.
  90% in 0.0084 secs.
  95% in 0.0108 secs.
  99% in 0.0187 secs.