Core: Add inner hits 

Inner hits allows to embed nested inner objects, children documents or the parent document that contributed to the matching of the returned search hit as inner hits, which would otherwise be hidden.

Example search request w/ nested query:

```bash
curl -XGET "http://localhost:9200/stack/question/_search" -d'
{
  "query": {
    "nested": {
      "path": "comments",
      "query": {
        "match": {
          "comments.text": "elasticsearch"
        }
      }
    }
  },
  "_source": {
    "include": "title"
  },
  "inner_hits": {
    "comments": {
      "path": {
        "comments": {
          "_source": {
            "include": "text"
          },
          "query": {
            "match": {
              "comments.text": "elasticsearch"
            }
          }
        }
      }
    }
  }
}'
```

Example response:
```json
{
   "took": 16,
   "timed_out": false,
   "_shards": {
      "total": 5,
      "successful": 5,
      "failed": 0
   },
   "hits": {
      "total": 3,
      "max_score": 2.1920953,
      "hits": [
         {
            "_index": "stack",
            "_type": "question",
            "_id": "485316",
            "_score": 2.1920953,
            "_source": {
               "title": "timestamp +5 hours logstash"
            },
            "inner_hits": {
               "comments": {
                  "hits": {
                     "total": 1,
                     "max_score": 2.1920953,
                     "hits": [
                        {
                           "_index": "stack",
                           "_type": "question",
                           "_id": "485316",
                           "_nested": {
                              "field": "comments",
                              "offset": 2
                           },
                           "_score": 2.1920953,
                           "_source": {
                              "text": "So my timezone is EST which shows in the log, but the agent stamps 2013-03-06T17:03:56.934Z before it sends to elasticsearch."
                           }
                        }
                     ]
                  }
               }
            }
         },
         {
            "_index": "stack",
            "_type": "question",
            "_id": "107518",
            "_score": 1.8563976,
            "_source": {
               "title": "Web based file search in the lan?"
            },
            "inner_hits": {
               "comments": {
                  "hits": {
                     "total": 1,
                     "max_score": 1.8563976,
                     "hits": [
                        {
                           "_index": "stack",
                           "_type": "question",
                           "_id": "107518",
                           "_nested": {
                              "field": "comments",
                              "offset": 2
                           },
                           "_score": 1.8563976,
                           "_source": {
                              "text": "Did you ever settle on something? I am looking for something similar. Does Solr work? that seems to be the most common suggestion. I tried elasticsearch but didn't know how to add a network path as an index to it."
                           }
                        }
                     ]
                  }
               }
            }
         },
         {
            "_index": "stack",
            "_type": "question",
            "_id": "419532",
            "_score": 1.2994784,
            "_source": {
               "title": "How to silently buffer tunnel traffic on network split, and automatically renew the connection when possible?"
            },
            "inner_hits": {
               "comments": {
                  "hits": {
                     "total": 1,
                     "max_score": 1.2994784,
                     "hits": [
                        {
                           "_index": "stack",
                           "_type": "question",
                           "_id": "419532",
                           "_nested": {
                              "field": "comments",
                              "offset": 4
                           },
                           "_score": 1.2994784,
                           "_source": {
                              "text": "Let me elaborate. I'm using ElasticSearch replication, when network disconnects, it puts all \"cluster\" into \"yellow\" state, means writes are postponed. I want to use \"localhost\" as replica nodes' host setting in config, both in China and in Germany. Under this there will be daemons acting as tcp proxy buffer and handling disconnections nicely. That's the outline of the idea, however maybe it would better to just leave it to ElasticSearch's protocol and handle yellow state in my app."
                           }
                        }
                     ]
                  }
               }
            }
         }
      ]
   }
}
```
For documentation and more examples check the: `inner-hits.asciidoc` file.

Closes #3022, #3152
Ah forgot that one, I'll add it. However I find it odd that one needs to check for null when invoking Filter#getDocIdSet and for DocIdSet#iterator. I wonder if in Lucene the first null check would be sufficient. The second null check looks redundant to me.