MB-11917 Async map_doc implementation

map_doc function make use of NIF which in turn calls v8 library
to perform map function. Currently this is implemented in
synchronous fashion. Since map may take long amount of time
depending on map function, number of views and number of documents,
it is better to implement it in asynchronous fashion. In order to
implement async map, a template task queue class is implemented and
all map requests are enqueued and the function returns immediately.
4 global threads are created since view engine support 4 concurrent
view indexing. All incoming map requests are randomly assigned to
one of these 4 threads to balance load. These worker threads
dequeue tasks, does the map and sends map results or error as
messages to erlang world. This will help erlang scheduler to get
proper reduction counts for map request and thus perform fair
task scheduling.

Change-Id: I8e53a85fe4056df480e0f74c0cf94c0410ea56c9
Use round-robin scheduling for mapreduce nif workers

Using random work allocation to mapreduce nif worker threads may
cause contention on worker threads and work distribution may not be
uniform. Considering the workload, when a map context is created
the updater uses that context to perform a number of map operations
during the lifetime of the updater. Hence, the best work distribution
may be to assign one worker thread to a map context and use the
same worker for all map tasks for that context. The worker thread
can be assigned in round-robin fashion to each map context created
by the updater.

Change-Id: I70d4c186086c42ad4f06e00a243a08e8757bd94e
Merge branch 'roundrobin' implements roundrobin task assignment
to queues instead of random assignment for better load balance.

Conflicts:
	src/mapreduce/mapreduce_nif.cc
	src/mapreduce/taskqueue.h