Add "lossless" tags

New type is `@@@` - which is defined to be:

    type Tagged[T] = {type Tag = T}
    type @@@[+T, Tag] = Tagged[Tag]

Usage is:

    scala> Tags.MinVal.unwrap(Tags.MinVal.lossless(1) |+|
    Tags.MinVal.lossless(2))
    res0: Int = 1

    scala> Tags.MinVal.lossless(1) * Tags.MinVal.lossless(2)
    <console>:14: error: value * is not a member of
    scalaz.@@@[Int,scalaz.Tags.MinVal]
                  Tags.MinVal.lossless(1) * Tags.MinVal.lossless(2)
                                                        ^
Make `Tagged` private

Gives a tiny amount of safety - nobody should be using this directly.
LosslessTagged
Only have 2 asInstanceOf calls for lossless tags
Merge remote-tracking branch 'origin/scalaz-seven' into lossless-tags
Change tagging - tagged are no longer subtypes

Tagged types were previously subtypes:

    A @@ T <: A

This is no longer the case since it caused a few bugs. For example, the
following compiled but give 5 as the result:

    scala> Monoid[Int].append(Tags.Multiplication(2), Tags.Multiplication(3))
    <console>:14: error: type mismatch;
     found   : scalaz.@@[Int,scalaz.Tags.Multiplication]
        (which expands to)  AnyRef{type Tag = scalaz.Tags.Multiplication; type Self = Int}
     required: Int
                  Monoid[Int].append(Tags.Multiplication(2), Tags.Multiplication(3))
                                                        ^

So now we have to manually unwrap our tags:

    scala> Monoid[Int @@ Tags.Multiplication].append(Tags.Multiplication(2), Tags.Multiplication(3))
    res1: scalaz.@@[Int,scalaz.Tags.Multiplication] = 6

    scala> Tag.unwrap(res1)
    res2: Int = 6

The unwrap gets inlined to just an `asInstanceOf` call, which is very
cheap.
Fix the example project for lossless tags
Give type parameter to unwrap in Cofree for 2.9.3
Merge pull request #693 from puffnfresh/lossless-tags

Lossless tags