If you look in your Output window when debugging, you'll see that you have binding errors in there relating to the CloseCommand, stating that it doesn't belong to the relevant VM. That's because your command isn't defined at the VM level - rather, it's defined at the container level. To fix this, use the relative source to find the tab item that contains this - and bind to that DataContext, like this:
<Button Content="x" Margin="0" Command="{Binding DataContext.CloseCommand, RelativeSource={RelativeSource AncestorType={x:Type TabControl}}}" Width="16" Height="16"/>