Rest downloads

This pull request adds the ability to easily create file downloads in REST methods:

```groovy
[@webmethod(verb = 'GET')]
public webservices.rest.srv.Output downloadFile() {
  $target= new File(...);
  if ($target.exists()) {
    return StreamingOutput::of($target);
  } else {
    return Response::notFound().withPayload($target.getFilename() ~  ' not found');
  }
}
```

Currently, a hack like this is necessary:

```groovy
[@webmethod(verb = 'GET')]
public Response downloadFile() {
  $target= new File(...);

  // FIXME: The REST API should support return streams. Until that is available,
  // hack up the RestFormat enum and create a serializer which will simply read
  // the stream contents and return them in one big chunk to the client!
  $mime= util.MimeType::getByFileName($target.getURI());
  RestFormat::$UNKNOWN= new RestFormat(
    0, 
    'UNKNOWN', 
    new RestSerializer() {
      public string contentType() { return $mime; }
      public string serialize(var $payload) { return io.streams.Streams::readAll($payload.value); }
    }, 
    null
  );
  return Response::ok()
    .withHeader('Content-Type', $mime)
    .withHeader('Content-Length', $target.getSize())
    .withPayload($target.getInputStream())
  ;
}
```

The core of this pull request is the new `webservices.rest.srv.StreamingOutput` class. It provides the facilities to stream to the client from a given `InputStream`, a convenience factory method `of()` which will handle these streams, as well as `io.File`s and `io.collections.IOElement` instances, as well as accessors for media type, content length, headers and cookies:

```sh
$ xp -r webservices.rest.srv.StreamingOutput
@FileSystemCL<...\xp.thekid.core\core\src\main\php\>
public class webservices.rest.srv.StreamingOutput extends webservices.rest.srv.Output {
  public var webservices.rest.srv.StreamingOutput::$inputStream
  public var webservices.rest.srv.StreamingOutput::$mediaType
  public var webservices.rest.srv.StreamingOutput::$contentLength
  public var webservices.rest.srv.StreamingOutput::$payload
  public var webservices.rest.srv.Output::$status
  public var webservices.rest.srv.Output::$headers
  public var webservices.rest.srv.Output::$cookies

  public webservices.rest.srv.StreamingOutput __construct([io.streams.InputStream $inputStream= null])

  public static self of(var $arg) throws lang.IllegalArgumentException

  public self withStatus(int $status)
  public self withContentLength(int $length)
  public self withMediaType(string $type)
  public void write(io.streams.OutputStream $out)
  protected void writeHead(scriptlet.Response $response, peer.URL $base, string $format)
  protected void writeBody(scriptlet.Response $response, peer.URL $base, string $format)
  public self withHeader(string $name, string $value)
  public self withCookie(scriptlet.Cookie $cookie)
  public bool writeTo(scriptlet.Response $response, peer.URL $base, string $format)
  public string hashCode()
  public bool equals(lang.Generic $cmp)
  public string getClassName()
  public lang.XPClass getClass()
  public string toString()
}
```