Add ~x.y.z and ^x.y.z parsing

This may be better expressed as:

```rust
let minor = match self.minor {
    Some(n) => n,
    None => return self.major == ver.major
};
```

That way you can avoid the `unwrap()` below. This may also apply to `is_compatible` below.