Last operator

Equivalent to lastAsync in Rx.Net.
Fix behavior of BlockingObservable.last

It now throws an IllegalArgumentException instead of returning null if no elements are emitted.

This is based on feedback from @headinthebox confirming this expected behavior:

var xs = Observable.Range(1,0);                       		// empty sequence
int x = xs.Last().Dump();                             		// throws “sequence contains no elements”       RxJava => BlockingObservable.last()
IObservable<int> ys = xs.TakeLast(1).Dump();          // OnCompleted()                                                RxJava => Observable.takeLast(1)
IObservable<int> zs = xs.LastAsync().Dump();          // OnError(“sequence contains no elements”)    RxJava => Observable.last()
Merge pull request #470 from benjchristensen/operator-last

Operator: Last
Fix unit test after last() changed behavior
Add and clarify unit tests in map
Merge pull request #471 from benjchristensen/error-handling

Unit Test Tweaks
BugFix: Unsubscribing does not work when using subscribeOn(Schedulers.newThread())

I believe this fixes https://github.com/Netflix/RxJava/issues/431
Merge pull request #472 from benjchristensen/issue-431-newThreadUnsubscribe

BugFix: Issue 431 Unsubscribe with Schedulers.newThread
Reimplemented the 'reduce' operator
Updated the unit tests and removed synchronized
Used 'materialize' and 'dematerialize' to implement the 'reduce' operator
Used 'last' to implement 'reduce'