[Aggregations] Meta data support

This commit adds the ability to associate a bit of state with each individual aggregation.

The aggregation response can be hard to stitch back together without having a reference to the aggregation request. In many cases this is not available, many json serializer frameworks cache types globally or have a static deserialisation override mechanism. In these cases making the original request available, if at all possible, would be a hack. 

The old facets returned `_type` which was just enough metadata to know what the originating facet type in the request was. 

This PR takes `_type` one step further by introducing ANY arbitrary meta data. This could be further <strike>ab</strike>used for instance by generic/automated aggregations that include UI state (color information, thresholds, user input states, etc) per aggregation.

[Here's a gist of a sense session](https://gist.github.com/Mpdreamz/785a3347d4415e1fe6bb#file-aggs-metada) you can use to review this branch

This PR supersedes #6465 which got stale and horribly out of date with all the new aggregations in `1.2-1.4`. 

Tested on a cluster of multiple nodes as well.

Example request:

```json
"aggs": {
    "name": {
      "terms": {
        "field": "title"
      },
      "meta": { "number_of_clicks" : 2 },
      "aggs": {
        "viewport" : {
          "meta" : { 
              "hasColor" : true 
          },
          "geo_bounds" : {
            "field" : "location"
          }
        },
        "empty_agg" : {
          "meta" : { 
             "string" : "returns"
          },
          "sum": {
            "field": "i_do_not_exist"
          }
        },
```


Example response:

```json
"aggregations": {
      "name": {
         "meta": {
            "number_of_clicks": 2
         },
         "doc_count_error_upper_bound": 0,
         "sum_other_doc_count": 0,
         "buckets": [
            {
               "key": "banner",
               "doc_count": 1,
               "viewport": {
                  "meta": {
                     "hasColor": true
                  },
                  "bounds": {
                     "top_left": {
                        "lat": 28,
                        "lon": 21
                     },
       <redacted />
```