Feature/object initializer syntax

This PR extends the work that was done to add [the object inititializer syntax that was added to Search()](https://github.com/elasticsearch/elasticsearch-net/blob/develop/src/Tests/Nest.Tests.Unit/Search/InitializerSyntax/InitializerExample.cs#L33) to **ALL** the other API endpoints. 

Please refer to [this set of unit tests](https://github.com/elasticsearch/elasticsearch-net/tree/feature/object-initializer-syntax/src/Tests/Nest.Tests.Unit/ObjectInitializer) for an example for each individual API call.

As an example: 

## CreateIndex() fluent syntax

```csharp
var response = this._client.CreateIndex(c => c
	.Index("new-index-name")
	.Settings(s => s
		.Add("index.settings", "value")
	)
	.AddMapping<object>(m => m
		.Type("my_root_object")
		.Properties(p => p
			.String(sm => sm.Name("my_field").Analyzer("default"))
		)
	)
);
```

## CreatIndex() object initializer syntax

```csharp
var request = new CreateIndexRequest("new-index-name")
{
	IndexSettings = new IndexSettings
	{
		Settings = new Dictionary<string, object>
		{
			{"index.settings", "value"}
		},
		Mappings = new List<RootObjectMapping>
		{
			{ new RootObjectMapping
			{
				Name = "my_root_object",
				Properties = new Dictionary<PropertyNameMarker, IElasticType>
				{
					{"my_field", new StringMapping() { Analyzer = "default" } }
				}
			}}
		}
	}
};
var response = this._client.CreateIndex(request);
```
In most cases the fluent syntax is terser but the object initializer syntax has the following benefits:

* If lambda's are not your deal, you can still use NEST and fully mapped requests without resorting to the low level client and anonymous C# objects
* The lambda syntax relies on `Func<R, R>` as method argument which is really hard to mock
* The object initializer syntax pushes required arguments to the constructor. 

The choice is now yours! We've enabled this on ALL the API endpoints mapped by NEST. 

### Percolate() missing state
The Percolate() did not map everything exposed to it as documented here: http://www.elasticsearch.org/guide/en/elasticsearch/reference/master/search-percolate.html#_percolate_api 

You can now specify filter, aggs, facets size, sort etcetera when percolating documents. 

NEST also did not expose a way to percolate an existing doc. You can now specify .Id() and percolate on a document already indexed.

### Metrics support.
In debug mode every request returns a `Metrics` property that exposes exactly which calls NEST/Elasticsearch.NET did and how long it took. This is especially handy to see if a request resulted in a ping and/or sniff. 

To enable/disable this explicitly call `.EnableMetrics(true/false)` on `ConnectionSettings`.