implements `_apply_unitary_` for YPowGate (#2051)
implements `_apply_unitary_` for YPowGate (#2051)

Not sure if there was a reason `_apply_unitary_` was left out of YPowGate? I guess in raw flop counts this should be equivalent to einsum, but I'm guessing numpy has optimizations for scalar multiplication so this is still a faster method. For example:

```
import timeit

# setup code is only run once.
setup = '''
import cirq
import numpy as np
k = 5
c = cirq.Circuit.from_ops([cirq.Y(q) for q in cirq.LineQubit.range(5)])
sim = cirq.Simulator()
init = cirq.testing.random_superposition(2 ** 5).astype(np.complex64)
'''

import numpy as np
out = timeit.Timer('sim.simulate(c, initial_state=np.copy(init))', setup=setup).repeat(100, number=2000)
print("best: {}".format(min(out)))
print("rel. std: {}".format(np.std(out, ddof=1)/ np.mean(out)))
```

on master this yields:
```
>>> best: 1.293166100018425
>>> rel. std: 0.02279256808015728
```
while on this branch I get:
```
>>> best: 0.8134043000172824
>>> rel. std: 0.05712308794562993
```

quantumlib/Cirq,balopat/Cirq,quantumlib/Cirq,balopat/Cirq,quantumlib/Cirq,quantumlib/Cirq,quantumlib/Cirq,balopat/Cirq