use recursive_mutex to protect State

Summary:
maelstrom destructs a Promise during an indirect call from
maybeCallback and deadlocks on itself unless we use a recursive mutex.

There may be a smarter way to proceed but at the moment I can't build
and deploy a package from trunk because the service is non-functional
:-/

Test Plan:
run

```
fbconfig -r folly/wangle messaging/maelstrom
fbmake runtests
```

Reviewed By: hannesr@fb.com

Subscribers: fugalh, fsilva

FB internal diff: D1428504
Expression SFINAE issue in base.h

Summary:
MSVC 14 is still broken with expression sfinae - and the things that break are often strange
Moving this out into two expr templates solves the compilation issue

Test Plan: fbconfig -r folly && fbmake runtests

Reviewed By: tjackson@fb.com

FB internal diff: D1413297
MSVC intrinsics for bits and cpuid

Summary: Use msvc intrinsics for cpuid, popcount, byteswap, and bit scan functionality

Test Plan: fbconfig -r folly && fbmake runtests

Reviewed By: delong.j@fb.com

FB internal diff: D1413254
MSVC includes for inet/sockets

Summary:
MSVC has all the sockets and internet functionality required except for one missing item - which can safely be defined to a windows specific type
But it requires a different set of headers than on *nix systems

Test Plan: fbconfig -r folly && fbmake runtests

Reviewed By: delong.j@fb.com

FB internal diff: D1413265
Small changes for cygwin build

Summary:
Folly is almost "out of the box" working with cygwin

This has the proper ifdefs to include cygwin in two areas and a workaround for a cygwin bug when including headers

Test Plan: fbconfig -r folly && fbmake runtests

Reviewed By: delong.j@fb.com

FB internal diff: D1413303
Enforce max uncompressed size; use safe LZ4 decompressor, which requires a newer version of LZ4

Test Plan: folly/io/test, whatever contbuild dreams up for hphp

Reviewed By: meyering@fb.com

Subscribers: meyering, hphp-diffs@, ps, jhj, kma, sainbar, lesha

FB internal diff: D1429372

@override-unit-failures
Fix another race in Notification Queue

Summary: Consider a case we found that the queue is empty and unlocked and before our setActive(false) from SCOPE_EXIT gets called (or gets the lock) putMessageImpl got the lock. Now putMessage thinks that we donot want to add another signal but actually we do.

Test Plan:
Running mcreplay2 without running into this problem on a box.
Benchmark:

Reviewed By: davejwatson@fb.com

FB internal diff: D1428249