Add Search functionality to the API

This change includes functionality to parse the search API parameters, build a search DSL and perform the search against elasticsearch.
If you change this to:

    func (h *Handler) serveSearch(w http.ResponseWriter, req *http.Request) (interface{}, error) {

then we can wrap it using HandleJSON and you can just return the errors
and the final result. It would also be consistent with the other handlers.