function bench( name, options, benchmark ) {
	var h = harness( done );
	if ( arguments.length < 2 ) {
		h( name );
	} else if ( arguments.length === 2 ) {
		h( name, options );
	} else {
		h( name, options, benchmark );
	}
	return bench;
}
Runs a benchmark.

@param {string} name - benchmark name
@param {Options} [options] - benchmark options
@param {boolean} [options.skip=false] - boolean indicating whether to skip a benchmark
@param {(PositiveInteger|null)} [options.iterations=null] - number of iterations
@param {PositiveInteger} [options.repeats=3] - number of repeats
@param {PositiveInteger} [options.timeout=300000] - number of milliseconds before a benchmark automatically fails
@param {Function} [benchmark] - function containing benchmark code
@throws {TypeError} first argument must be a string
@throws {TypeError} options argument must be an object
@throws {TypeError} must provide valid options
@throws {TypeError} benchmark argument must a function
@returns {Benchmark} benchmark harness

@example
bench( 'beep', function benchmark( b ) {
    var x;
    var i;
    b.tic();
    for ( i = 0; i < b.iterations; i++ ) {
        x = Math.sin( Math.random() );
        if ( x !== x ) {
            b.ok( false, 'should not return NaN' );
        }
    }
    b.toc();
    if ( x !== x ) {
        b.ok( false, 'should not return NaN' );
    }
    b.end();
});