Implement characteristic polynomial

Implement characteristic polynomial using `berkowitz`'s algorithm. Only the coefficients of the characteristic polynomial are returned, not the characteristic polynomial itself.
So if you have a complicated symbolic matrix, I thought that the characteristic polynomial can contain symbols. E.g. in sympy:
```
In [2]: var("a b c d")
Out[2]: (a, b, c, d)

In [3]: M = Matrix([[a, b], [c, d]])

In [4]: M
Out[4]: 
⎡a  b⎤
⎢    ⎥
⎣c  d⎦

In [5]: M.charpoly()
Out[5]: 
PurePoly(_lambda**2 + (-a - d)*_lambda + a*d - b*c, _lambda, domain='ZZ[a,b,c,
d]')
```
So how would this polynomial be represented in terms of `B`?