Fixed the issues of takeLast(items, 0) and null values

Hi,

There are two issues about `takeLast` #85 #140. The essential cause is `LinkedBlockingDeque`.

1. count == 0
`takeLast` in RxJava will throw an exception when count == 0, as `LinkedBlockingDeque` rejects count <= 0. However, in c#, TakeLast with 0 count is valid. The following codes is OK in C# (no exception and do nothing):
```c#
            var source = Observable.Return(1).TakeLast(0);
            source.Subscribe(
                x => 
                    Console.WriteLine("subscriber got " + x)
            );
            Console.ReadLine();
```

2. null values
LinkedBlockingDeque requires the elements can not be null but an observable can emit a null value.

I used `ReentrantLock` and `LinkedList` to replace `LinkedBlockingDeque`. Please take a look. Thanks.