Fixing the issue #123

Here is what the fix does:
1. If the parameter has inline constraint but is optional as well, it creates OptionalRouteConstraint -- which is new type of constraints added -- for that parameter. The OptionalRouteConstraint takes the original IRouteConstraint that would have been created for this parameter as input.

2. The 'Match' method on OptionalRouteConstraint checks if the value for the parameter is present. If it is it delegates to the 'Match' method of the original IRouteConstraint. If the value is not present, it returns true. 
The old code here isn't great.

Inside a unit test, instead of a cast, do it like this:

```
var  optional = Assert.IsType<OptionalRouteConstraint>(templatePart.InlineConstraint);
Assert.IsType<IntRouteConstraint>(optional.InnerConstraint);
```

and so on. 

Note that my PR rearchitects the code that this tests. If you finish first, I'll fix it it for you, and if I finish first, then I'll help move it to the right place.