Fixes issue #326 - Argument Constraints should support derived types as Type Arguments

Fixes issue #326. The fix will only invoke the predicate if the type matches or if the argument is null. For non-nullable types it will always just use the branch ``` argument is T ```.

The new unit tests should cover 100% of branches. Is there anything I need to update in FakeItEasy.Specs? I'm not too familiar with that stuff.
This can be:

```C#
return (argument == null || argument is T) && this.predicate.Invoke((T)argument);
```